source

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

manysource 2023. 4. 10. 22:01

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

SQL 쿼리는 CMM-CPP-FAP-ADD와 같이 읽기 어려운 이름을 가진 수백 개의 뷰/테이블을 쿼리합니다.이러한 데이터베이스들은 필요없고 이해하기 어렵습니다.이 쿼리 결과는 보고서를 공급하기 위해 스테이징 테이블에 저장해야 합니다.

스테이징 테이블을 작성해야 하는데 여기에 표시된 데이터 유형을 찾기 위해 수백 개의 뷰/테이블을 파헤쳐야 하기 때문에 이 테이블을 구성하는 더 나은 방법이 없을까 고민해야 합니다.

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

제약에는 관심이 없습니다. 데이터 유형을 알고 싶을 뿐입니다.

SQL Server 2012 이상의 경우:쿼리를 문자열에 넣으면 다음과 같은 결과 세트 데이터 유형을 얻을 수 있습니다.

DECLARE @query nvarchar(max) = 'select 12.1 / 10.1 AS [Column1]';
EXEC sp_describe_first_result_set @query, null, 0;  
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');

여기 애런의 대답으로 추정해봐요

또, 다음과 같은 기능을 사용할 수 있습니다.

SQL_VARIANT_PROPERTY()

메타데이터에 직접 액세스 할 수 없는 경우(링크된 서버 쿼리 등).

SQL Server 2005 이후에는 INFORMATION_SCHEMA가 아닌 카탈로그 뷰(sys.columns)를 사용하는 것이 좋습니다.단, 다른 플랫폼으로의 이식성이 중요한 경우는 제외합니다.INFORMATION_SCHEMA 뷰는 변경되지 않으므로 SQL Server의 후속 버전에서 새로운 기능 등에 대한 정보가 점차 부족해질 수 있습니다.

더 쉬운 방법이 있을 거야그리고 보라, 저기...!

"sp_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'

열 별칭을 사용하여 출력을 개선할 수 있습니다.

쿼리를 실행할 때마다 스테이징 테이블을 처음부터 다시 작성할 수 있습니까?이 경우 구문을 사용하여 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;
select COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH 
from INFORMATION_SCHEMA.COLUMNS 
where TABLE_NAME='yourTable';

sp_first_result_set

쿼리의 첫 번째 결과 세트의 데이터 유형을 분석함으로써 쿼리의 데이터 유형을 식별하는 데 도움이 됩니다.

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

기술사양서에서 사용할 수 있는 결과를 렌더링하기 위해 간단한 케이스 스테이트먼트를 사용합니다.이 예에는 데이터베이스와 관련된 모든 조건이 포함되어 있지는 않지만 사용하기 좋은 템플릿이 있습니다.

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

데이터 유형을 확인하는 중입니다.SQL Server 데이터베이스의 데이터 유형을 확인하는 첫 번째 방법은 SYS 스키마 테이블을 사용한 쿼리입니다.다음 쿼리에서는 COLUMNS 및 TYPE 테이블을 사용합니다.

    SELECT C.NAME AS COLUMN_NAME,
       TYPE_NAME(C.USER_TYPE_ID) AS DATA_TYPE,
       C.IS_NULLABLE,
       C.MAX_LENGTH,
       C.PRECISION,
       C.SCALE
FROM SYS.COLUMNS C
JOIN SYS.TYPES T
     ON C.USER_TYPE_ID=T.USER_TYPE_ID
WHERE C.OBJECT_ID=OBJECT_ID('your_table_name');

이 방법으로 열의 데이터 유형을 찾을 수 있습니다.

이 쉬운 쿼리는 데이터 유형 비트를 반환합니다.이 cnic는 다른 데이터 유형에 사용할 수 있습니다.

CAST(0 AS BIT)를 OK로 선택합니다.

언급URL : https://stackoverflow.com/questions/1601727/how-do-i-return-the-sql-data-types-from-my-query