isnull 对于动态生成的列

isnull for dynamically Generated column

我正在使用动态生成的列获取临时 table 假设它是来自其他来源的列 A,B,C,D 等。

现在我手上有了生成了列的临时 table。我不得不使用 temp table.

编写存储过程

所以我的存储过程就像

create proc someproc() 
as 
begin 
Insert into #searchtable 
select isnull(#temp.*,0.00) 
End

现在 #searchresult 是 table 由我创建的,用于存储临时 table 列。当我想检查 isnull#tempdb 列时,问题就出现了。因为来自源代码,它可能是 3 列,下次可能是 4 列。它改变了。

因为它是动态生成的,所以我不能使用每个列名并像下面这样使用:

isnull(column1,0.00)
isnull(column2,0.00)

我必须使用生成的所有列并检查值是否为空使用 0.00

我在下面试过但没有用:

  isnull(##temp.*,0.00),  

通过从 [database].NFORMATION_SCHEMA.COLUMNS

中获取动态 table 的列名称来尝试使用动态代码
--Get the Column Names for the your dynamic table and add the ISNULL Check:

DECLARE @COLS VARCHAR(MAX) = ''

SELECT @COLS = @COLS + ', ISNULL(' + COLUMN_NAME + ', 0.00) AS ' + COLUMN_NAME
FROM tempdb.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME LIKE '#temp[_]%' -- Dynamic Table (here, Temporary table)

DECLARE @COLNAMES VARCHAR(MAX) = STUFF(@COLS, 1, 1, '')

--Build your Insert Command:

DECLARE @cmd VARCHAR(MAX) = '
INSERT INTO #temp1
SELECT ' + @COLNAMES + ' FROM #temp'

--Execute:

EXEC (@cmd)

希望,我理解你的评论是对的:

CREATE PROCEDURE someproc
AS 
IF OBJECT_ID(N'#searchtable') IS NOT NULL DROP TABLE #searchtable

IF OBJECT_ID(N'#temp') IS NOT NULL
BEGIN

    DECLARE @sql nvarchar(max),
            @cols nvarchar(max)

    SELECT @cols = (
        SELECT ',COALESCE('+QUOTENAME([name])+',0.00) as '+QUOTENAME([name])
        FROM sys.columns 
        WHERE [object_id] = OBJECT_ID(N'#temp')
        FOR XML PATH('')
    ) 

    SELECT @sql = N'SELECT '+STUFF(@cols,1,1,'')+' INTO #searchtable FROM #temp'

    EXEC sp_executesql @sql

END

此 SP 检查 #temp table 是否存在。如果存在,那么它将获取 sys.columns table 中的所有列名,然后我们创建一个类似于 ,COALESCE([Column1],0.00) as [Column1], etc 的字符串。然后我们进行动态 SQL 查询,例如:

SELECT COALESCE([Column1],0.00) as [Column1] INTO #searchtable FROM #temp

并执行。此查询结果将存储在#searchtable.

注意:使用COALESCE代替ISNULL,使用sp_executesql代替直接exec。这是一个很好的做法。