我正在使用动态生成的列获取临时表,假设它是来自其他来源的列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),
答案 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
。这是一个很好的做法。