쿼리에서 SQL 데이터 유형을 반환하려면 어떻게합니까?
필자는 필요하지도 이해하고 싶지도 않은 거대한 (예 : CMM-CPP-FAP-ADD와 같이 읽기 어려운 이름을 가진 수백 개의 뷰 / 테이블) 데이터베이스를 쿼리하는 SQL 쿼리가 있습니다. 이 쿼리의 결과는 보고서를 제공하기 위해 스테이징 테이블에 저장되어야합니다.
스테이징 테이블을 만들어야하지만 여기에 표시되는 데이터 유형을 찾기 위해 조사 할 수백 개의 뷰 / 테이블이 있으므로이 테이블을 구성하는 더 좋은 방법이 있는지 궁금합니다.
누구든지 SQL Server 2008 도구를 사용하여 SQL 2000 데이터베이스의 원본 데이터 형식을 구체화하는 방법에 대해 조언 할 수 있습니까?
일반적인 예로서 다음과 같은 쿼리에서 알고 싶습니다.
SELECT Auth_First_Name, Auth_Last_Name, Auth_Favorite_Number
FROM Authors
실제 결과 대신 다음을 알고 싶습니다.
Auth_First_Name is char(25)
Auth_Last_Name is char(50)
Auth_Favorite_Number is int
저는 제약에 관심이없고 데이터 유형 만 알고 싶습니다.
select * from information_schema.columns
시작할 수 있습니다.
결과 (또는 상위 10 개 결과)를 임시 테이블에 삽입하고 임시 테이블에서 열을 가져올 수도 있습니다 (열 이름이 모두 다른 경우).
SELECT TOP 10 *
INTO #TempTable
FROM <DataSource>
그런 다음 다음을 사용하십시오.
EXEC tempdb.dbo.sp_help N'#TempTable';
또는
SELECT *
FROM tempdb.sys.columns
WHERE [object_id] = OBJECT_ID(N'tempdb..#TempTable');
여기 Aaron의 대답 에서 외삽되었습니다 .
당신은 또한 사용할 수 있습니다 ...
SQL_VARIANT_PROPERTY()
... 메타 데이터에 직접 액세스 할 수없는 경우 (예 : 연결된 서버 쿼리).
http://msdn.microsoft.com/en-us/library/ms178550.aspx
SQL Server 2005 이상에서는 INFORMATION_SCHEMA가 아닌 카탈로그 뷰 (sys.columns)를 사용하는 것이 좋습니다. 다른 플랫폼으로의 이식성이 중요하지 않는 한. INFORMATION_SCHEMA 뷰는 변경되지 않으므로 SQL Server의 연속 버전에서 새로운 기능 등에 대한 정보가 점진적으로 부족하게됩니다.
SQL Server 2012 이상 : 쿼리를 문자열에 배치하면 다음과 같은 결과 집합 데이터 형식을 얻을 수 있습니다.
DECLARE @query nvarchar(max) = 'select 12.1 / 10.1 AS [Column1]';
EXEC sp_describe_first_result_set @query, null, 0;
이 작업을 수행하는 더 쉬운 방법 이 있어야 합니다 ... 낮고 보라, 거기에 ...!
" sp_describe_first_result_set "는 당신의 친구입니다!
이제 질문이 SQL Server 2000에 대해 특별히 요청되었다는 것을 알고 있지만 이후 버전에 대한 유사한 솔루션을 찾고 있었고이를 달성하기 위해 SQL에서 일부 기본 지원을 발견했습니다.
SQL Server 2012 이후 cf. "sp_describe_first_result_set"-BOL에 연결
나는 이미 위 의 @Trisped 와 유사한 기술을 사용하여 솔루션 을 구현했으며 네이티브 SQL Server 구현을 구현하기 위해 그것을 뜯어 냈습니다.
아직 SQL Server 2012 또는 Azure SQL Database를 사용하지 않는 경우 2012 년 이전 시대 데이터베이스 용으로 만든 저장된 프로시 저는 다음과 같습니다.
CREATE PROCEDURE [fn].[GetQueryResultMetadata]
@queryText VARCHAR(MAX)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
--SET NOCOUNT ON;
PRINT @queryText;
DECLARE
@sqlToExec NVARCHAR(MAX) =
'SELECT TOP 1 * INTO #QueryMetadata FROM ('
+
@queryText
+
') T;'
+ '
SELECT
C.Name [ColumnName],
TP.Name [ColumnType],
C.max_length [MaxLength],
C.[precision] [Precision],
C.[scale] [Scale],
C.[is_nullable] IsNullable
FROM
tempdb.sys.columns C
INNER JOIN
tempdb.sys.types TP
ON
TP.system_type_id = C.system_type_id
AND
-- exclude custom types
TP.system_type_id = TP.user_type_id
WHERE
[object_id] = OBJECT_ID(N''tempdb..#QueryMetadata'');
'
EXEC sp_executesql @sqlToExec
END
SELECT COLUMN_NAME,
DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH
FROM information_schema.columns
WHERE TABLE_NAME = 'YOUR_TABLE_NAME'
더 나은 출력을 위해 열 별칭을 사용할 수 있습니다.
쿼리가 실행될 때마다 처음부터 스테이징 테이블을 다시 생성 할 수 있습니까? 그렇다면 SELECT ... INTO
구문을 사용 하고 SQL Server가 올바른 열 유형 등을 사용하여 테이블을 만드는 것에 대해 걱정할 수 있습니다.
SELECT *
INTO your_staging_table
FROM enormous_collection_of_views_tables_etc
이것은 열 속성과 관련된 모든 것을 제공합니다.
SELECT * INTO TMP1
FROM ( SELECT TOP 1 /* rest of your query expression here */ );
SELECT o.name AS obj_name, TYPE_NAME(c.user_type_id) AS type_name, c.*
FROM sys.objects AS o
JOIN sys.columns AS c ON o.object_id = c.object_id
WHERE o.name = 'TMP1';
DROP TABLE TMP1;
sp_describe_first_result_set
쿼리의 첫 번째 결과 집합의 데이터 유형을 분석하여 쿼리의 데이터 유형을 식별하는 데 도움이됩니다.
select COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME='yourTable';
I use a simple case statement to render results I can use in technical specification documents. This example does not contain every condition you will run into with a database, but it gives you a good template to work with.
SELECT
TABLE_NAME AS 'Table Name',
COLUMN_NAME AS 'Column Name',
CASE WHEN DATA_TYPE LIKE '%char'
THEN DATA_TYPE + '(' + CONVERT(VARCHAR, CHARACTER_MAXIMUM_LENGTH) + ')'
WHEN DATA_TYPE IN ('bit', 'int', 'smallint', 'date')
THEN DATA_TYPE
WHEN DATA_TYPE = 'datetime'
THEN DATA_TYPE + '(' + CONVERT(VARCHAR, DATETIME_PRECISION) + ')'
WHEN DATA_TYPE = 'float'
THEN DATA_TYPE
WHEN DATA_TYPE IN ('numeric', 'money')
THEN DATA_TYPE + '(' + CONVERT(VARCHAR, NUMERIC_PRECISION) + ', ' + CONVERT(VARCHAR, NUMERIC_PRECISION_RADIX) + ')'
END AS 'Data Type',
CASE WHEN IS_NULLABLE = 'NO'
THEN 'NOT NULL'
ELSE 'NULL'
END AS 'PK/LK/NOT NULL'
FROM INFORMATION_SCHEMA.COLUMNS
ORDER BY
TABLE_NAME, ORDINAL_POSITION
참고URL : https://stackoverflow.com/questions/1601727/how-do-i-return-the-sql-data-types-from-my-query
'code' 카테고리의 다른 글
beautifulsoup, html5lib : 모듈 객체에 _base 속성이 없습니다. (0) | 2020.12.10 |
---|---|
C ++ 함수 인수 안전성 (0) | 2020.12.10 |
전 처리기 지시문 #if와 #ifdef의 차이점 (0) | 2020.12.10 |
asp.net 회원은 이전 비밀번호를 모르고 비밀번호 변경 (0) | 2020.12.10 |
조건부 텍스트를 출력하는 Twig 속기 구문이 있습니까? (0) | 2020.12.10 |