我已将结果集存储在具有
的临时表中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
答案 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