SQL Server中

时间:2016-10-12 20:32:42

标签: sql sql-server

我有一些超过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_

所以我仍然认为它是截断的。

2 个答案:

答案 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)

在SQL中使用SELECT而不是print。

SELECT @colsUnPivot

此外,请确保在“结果到网格”中最大化这些值: Results to Grid Options