쿼리에서 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
쿼리의 첫 번째 결과 세트의 데이터 유형을 분석함으로써 쿼리의 데이터 유형을 식별하는 데 도움이 됩니다.
기술사양서에서 사용할 수 있는 결과를 렌더링하기 위해 간단한 케이스 스테이트먼트를 사용합니다.이 예에는 데이터베이스와 관련된 모든 조건이 포함되어 있지는 않지만 사용하기 좋은 템플릿이 있습니다.
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
'source' 카테고리의 다른 글
"'NSString *' 유형의 매개 변수로 'constant NSString *'을(를) 전송하면 한정자가 삭제됩니다." 경고 (0) | 2023.04.10 |
---|---|
PowerShell 문자열 보간 구문 (0) | 2023.04.10 |
치명적: 미입력 서브모듈 내 (0) | 2023.04.05 |
카테고리가 있는 모든 WordPress 게시물을 추출하기 위한 SQL 쿼리 (0) | 2023.04.05 |
MongoDB: 서버에 시작 경고가 있습니다. "데이터베이스에 대한 액세스 제어가 활성화되지 않았습니다." (0) | 2023.04.05 |