我有一个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
我不感兴趣的约束,我真的只是想知道的数据类型。
Answer 1:
select * from information_schema.columns
可以让你开始。
Answer 2:
你也可以插入结果(或前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');
从外推亚伦的答案在这里 。
Answer 3:
您还可以使用...
SQL_VARIANT_PROPERTY()
...在情况下,你不必对元数据的直接访问(如链接的服务器查询吧?)。
http://msdn.microsoft.com/en-us/library/ms178550.aspx
在SQL Server 2005及以后,你最好使用相对于INFORMATION_SCHEMA目录视图(SYS.COLUMNS)。 除非移植到其他平台上是非常重要的。 只要记住的是,INFORMATION_SCHEMA视图不会改变,所以他们将逐渐缺乏新功能等信息在SQL Server的后续版本。
Answer 4:
必须有连接更简单的方法来做到这一点...低不料,有...!
“sp_describe_first_result_set”是你的朋友!
现在,我的确意识到这个问题是专门为SQL Server 2000的要求,但我一直在寻找更高版本类似的解决方案,并发现了一些SQL原生支持来实现这一目标。
在SQL Server 2012年起参 “sp_describe_first_result_set” - 链接到BOL
我一直在使用类似的技术已经实施的解决方案@ Trisped是上面撕下它来实现本机的SQL Server实现。
如果你没有的SQL Server 2012或SQL Azure的数据库上呢,这是我对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
Answer 5:
对于SQL Server 2012及以上:如果将查询到的字符串,然后就可以得到结果集的数据类型,如下所示:
DECLARE @query nvarchar(max) = 'select 12.1 / 10.1 AS [Column1]';
EXEC sp_describe_first_result_set @query, null, 0;
Answer 6:
SELECT COLUMN_NAME,
DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH
FROM information_schema.columns
WHERE TABLE_NAME = 'YOUR_TABLE_NAME'
您可以使用列别名更好看输出。
Answer 7:
你可以逃脱从头每次执行查询时重新创建临时表? 如果是这样,你可以使用SELECT ... INTO
语法,让SQL Server的担心使用正确的列类型创建表等。
SELECT *
INTO your_staging_table
FROM enormous_collection_of_views_tables_etc
Answer 8:
select COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME='yourTable';
Answer 9:
这会给你一切列属性有关。
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;
Answer 10:
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
Answer 11:
我用一个简单的case语句来呈现结果,我可以在技术规范文档中使用。 这个例子不包含你会碰到与数据库中的每个条件,但它给你一个很好的模板一起工作。
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
文章来源: How do I return the SQL data types from my query?