code

쿼리에서 SQL 데이터 유형을 반환하려면 어떻게합니까?

codestyles 2020. 12. 10. 20:20
반응형

쿼리에서 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

쿼리의 첫 번째 결과 집합의 데이터 유형을 분석하여 쿼리의 데이터 유형을 식별하는 데 도움이됩니다.

https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-describe-first-result-set-transact-sql?view=sql-server-2017


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

반응형