我有一些超过700列/ 1000列的表。
现在我想将此表中的所有列显示为ISNULL(col1,0)
格式,因为当我使用PIVOT
/ UNPIVOT
时,如果有NULL
个值,那么它们就不会转换为NULL
并变为空字符串。因此,我尝试将NULL
替换为0
。
在这个例子中,我使用了sysobjects
表,以便您可以在ssms中尝试它。
由于VARCHAR(MAX)
和NVARCHAR(MAX)
都不够,因此结果不完整。如何获取所有行而不是几行?
DECLARE @colsUnpivot VARCHAR(MAX)
SET @colsUnPivot = STUFF((
SELECT ',' + 'ISNULL(' + QUOTENAME(name) + ', 0) AS '
+ QUOTENAME(name)
FROM sysobjects t
FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')
PRINT @colsUnPivot
set @query = 'SELECT id,code_name,lkp_value
FROM
(
SELECT unitid,institution,city,state,zip, '+ @colsUnpivot+'
FROM sysobjects) AS cp
UNPIVOT (lkp_value for code_name IN ('+@colsUnPivot+')
) AS up'
--PRINT @Query
--PRINT @Query1
exec(@query)
我的意思是上面的代码没有意义,但是我不能生成与我一样的东西,因为我必须在这里使用sysobjects。
但是上面的代码引发了一个错误:
Msg 102,Level 15,State 1,Line 6
附近的语法不正确
'('。
那是因为数据太多而且被截断了。
这是我的PRINT所说的,
,ISNULL([opd_
所以我仍然认为它是截断的。
答案 0 :(得分:2)
您的问题是PRINT命令将截断数据以便在SSMS中显示。
如果您只需要在SSMS中查看数据而不截断,我建议将其保留为XML并执行SELECT:
DECLARE @colsUnpivot xml
SET @colsUnPivot = (SELECT ',' + 'ISNULL(' + QUOTENAME(name) + ', 0) AS '
+ QUOTENAME(name)
FROM sysobjects t
FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)')
SELECT @colsUnPivot
SSMS以不同方式处理XML输出,并且具有更高的截断数据阈值。
答案 1 :(得分:1)