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
。这是一个很好的做法。
我正在使用动态生成的列获取临时 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
--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
。这是一个很好的做法。