isnull用于动态生成列

时间:2016-10-09 17:16:06

标签: sql sql-server tsql temp-tables isnull

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

现在我手里拿着生成列的临时表。我不得不使用临时表编写存储过程。

所以我的存储过程就像

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

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

由于它是动态生成的,我不能使用每个列名并使用如下所示:

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

我必须使用生成的所有列并使用0.00

检查值是否为空

我在下面尝试了这个但没有工作:

  isnull(##temp.*,0.00),  

2 个答案:

答案 0 :(得分:2)

尝试使用动态代码,方法是从[database].NFORMATION_SCHEMA.COLUMNS

获取动态表的列名
--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)

答案 1 :(得分:2)

希望,我理解你的评论:

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表。如果存在,那么它将从sys.columns表中获取所有列名称,并生成类似,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。这是一个很好的做法。