是否有更好的方法将isnull应用于所有列而不是我正在做的事情?

Mic*_*l A 1 sql t-sql sql-server sql-server-2005 sql-server-2008

在过去的几个月中,我不得不将'null'字段替换为'0'到查询返回的每一列.

节省了大量的时间(其中一些返回了大量的列)我一直在使用以下内容,然后将相关列的结果粘贴到一个新的查询中:

select      ',  isnull(' + COLUMN_NAME + ', 0)' + ' as ' + COLUMN_NAME
from        INFORMATION_SCHEMA.COLUMNS
where       TABLE_NAME = 'summary_by_scca_sales_category '
            and TABLE_SCHEMA = 'property''
Run Code Online (Sandbox Code Playgroud)

基本上我想知道是否有更好的方法可以做到这一点?理想情况下,我可以自动将isnull应用于查询中返回的所有列(不使用两个查询).

例如:

我想采取如下查询:

select  *
from    tablename
Run Code Online (Sandbox Code Playgroud)

并且对于*返回的每个列,将null结果替换为0,而不必为每列写入isnull()行.

编辑:

将以一种观点来实现这一点(doh,应该想到这一点).对于兴趣/教育,有没有办法用代码做这样的事情呢?

mwi*_*ahl 7

您可以VIEW针对所需的表创建一个所需ISNULL逻辑的位置.然后对视图的查询将返回您想要的数据.

编辑:

根据要求,一些示例代码可以VIEW自动完成创建.这非常粗略,但对于只有在它工作时才需要运行的东西.注意类型问题(你声明一切都应该转化为0所以我假设你的所有列都是合适的数字类型):

DECLARE @table_def varchar(max)
SET @table_def = 'CREATE VIEW <tname>_NoNull AS SELECT '

SELECT @table_def = REPLACE(@table_def, '<tname>', t.name) + 
    'ISNULL(' + c.name + ', 0) AS ' + c.name + ', '
FROM sys.tables t
    INNER JOIN sys.columns c ON t.object_id = c.object_id
WHERE t.name = <<table name>>

SELECT @table_def
Run Code Online (Sandbox Code Playgroud)

  • 有 - 你可以使用非常类似于上面的逻辑,只需动态创建和执行`CREATE VIEW`语句. (2认同)
  • @Codingo:如果有的话,可能不是_good_方式.`VIEW`在语义和直觉上是你最接近的东西......有一些特殊考虑因素的表格视图. (2认同)