我不知道这是否更快,但是您可能会使用一个技巧:
FOR XML AUTO将省略没有内容的列:
DECLARE @tbl TABLE(col1 INT,col2 INT,col3 INT);INSERT INTO @tbl VALUES (1,2,NULL),(1,NULL,NULL),(NULL,NULL,NULL);SELECt * FROM @tbl AS tblFOR XML AUTO
结果
col3是:丢失了…
<tbl col1="1" col2="2" /><tbl col1="1" /><tbl />
知道了这一点,您可以找到所有行中都不为NULL的列列表,如下所示:
DECLARE @ColList VARCHAr(MAX)=STUFF( ( SELECt DISTINCT ',' + Attr.value('local-name(.)','nvarchar(max)') FROM ( SELECt ( SELECT * FROM @tbl AS tbl FOR XML AUTO,TYPE ) AS TheXML ) AS t CROSS APPLY t.TheXML.nodes('/tbl/@*') AS A(Attr) FOR XML PATH('') ),1,1,'');SELECT @ColList
的内容
@ColList是现在
col1,col2。您可以在动态创建的字符串中放置此字符串
SELECT。更新:提示
将替换为排除所有 not-nullable
SELECT *创建的列列表将是非常聪明的。并且-如果需要并且可能的话-
类型包含非常大的数据(BLOB)。
INFORMATION_SCHEMA.COLUMNS__UPDATE2:性能
不知道您的 大数据 实际上意味着什么…只需在具有约500.000行(带有
SELECT*)的表上进行尝试,然后在不到一分钟的时间内正确返回。希望这足够快…
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)