使用临时表中的默认值更新列

时间:2012-09-15 15:06:20

标签: sql-server-2008 temp-tables

我已将结果集存储在具有

的临时表中
Column_Name, Data_Type, Default_Value
Col1         varchar      abc
Col2         varchar      abc
Col3         int          999
Col4         decimal      0.0
Col5         datetime     20120101

现在我必须构建一个语句,它将列名与表的列名进行比较,并根据临时表的数据类型,只要列值为NULL,它就会为它分配默认值。

我不知道该怎么做

这是我到目前为止所做的事情

  CREATE TABLE #ColumnData (Column_Name varchar(500), Data_Type varchar(20),

Default_Value varchar(50))

 DECLARE @query1 NVARCHAR(MAX) = '' 
  DECLARE @SchemaName VARCHAR(20)
  DECLARE @TableName VARCHAR(50)

SET @SchemaName = 'dbo'
SET @TableName = 'tblCustomer'





     select @query1 = @query1 + 'UPDATE ' + @schemaName + '.' + @tableName + ' SET ' + 
     c.COLUMN_NAME + ' = ' + c.Default_Value+ ' WHERE ' +   c.COLUMN_NAME 
     + ' = ''NULL'';' FROM #ColumnData c  
     WHERE C.TABLE_NAME = @tableName     

      EXECUTE sp_executesql @query1 

1 个答案:

答案 0 :(得分:1)

这应该可以解决问题。在SQL 2008中测试过。

update t
set t.col1 = isnull(t.col1, tr.col1) 
    t.col2 = isnull(t.col1, tr.col2)
    etc.
from my_table t
cross join temp_table tr

更新

- 像这样创建你的临时表,然后在一行中设置所有默认值(注意临时表名称末尾的_temp)。

select * into #MyTable_temp from dbo.MyTable where 1=1

DECLARE @query NVARCHAR(MAX) = 'update t set ' 
DECLARE @SchemaName VARCHAR(20) 
DECLARE @TableName VARCHAR(50) 

SET @SchemaName = 'dbo' 
SET @TableName = 'MyTable' 

set @query = @query + ( 
        select stuff((
            select ', ' + c.column_name + ' = isnull(t.' + c.column_name + ', tt.' + c.column_name + ')'
            from INFORMATION_SCHEMA.COLUMNS c
            where c.TABLE_NAME = @TableName
            for xml path('')), 1, 2, ''))

set @query = @query + ' from ' + @SchemaName + '.' + @TableName + ' t cross join #' + @TableName + '_temp tt'

select @query

您的查询应如下所示:

update t 
    set Col1 = isnull(t.Col1, tt.Col1), 
        Col2 = isnull(t.Col2, tt.Col2), 
        Col3 = isnull(t.Col3, tt.Col3), 
        Col4 = isnull(t.Col4, tt.Col4), 
        etc... 
from dbo.MyTable t 
cross join #MyTable_temp tt