2013-04-04 53 views
2

对于SSIS,我需要创建一个TSQL更新工作流以覆盖导入错误时的当前表记录。TSQL根据数据类型为每个列名称更新标记

我已经设置了整个SSIS过程,但我缺少SQL更新语句。

因此,如果导入过程中出现问题,表格中的当前记录(所有行)应该用短消息 - 例如“Error DB Import”进行更新。

由于我有多个表来处理我也得到不同的列名和数据类型
我会用这个语句来获取列名

SELECT COLUMN_NAME , * 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'myTable' 

,但我怎么能设置一个字符串消息的字符类型和NULL对于数字和日期类型。使用CASE语句?

在伪代码,它可能只是一个通过列循环:如果column_name是DATA_TYPE“炭”的,然后......

我还需要忽略每个表,这样我的第一个4列不要覆盖ID,日期等

如果你能帮我设置一个静态测试更新标准,我相信我可以将其转移到我的SSIS项目。

谢谢。

回答

2

听起来你正在寻找这样的事情:

SELECT 
    CASE DATA_TYPE 
    WHEN 'int' THEN NULL 
    WHEN 'varchar' THEN 'STRING MSG GOES HERE' 
    END, 
COLUMN_NAME , * 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'myTable' 
    AND ORDINAL_POSITION > 4 

SQL Fiddle Demo

您可以根据需要尽可能多的WHEN条款添加到CASE声明。此外,您想使用ORDINAL_POSITION列来排除前4列。

如果您需要使用此信息创建UPDATE语句,那么您需要使用Dynamic SQL来完成此操作。

编辑 - 动态SQL:

create procedure updateMyTable 
as 
begin 
    declare @sql varchar(max) 

    SELECT @sql = 'UPDATE myTable SET ' + 
    STUFF(
    (SELECT ', ' + COLUMN_NAME + ' = ' + 
    CASE DATA_TYPE 
     WHEN 'int' THEN 'NULL' 
     WHEN 'varchar' THEN '''STRING MSG GOES HERE''' 
    END 

    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = 'myTable' 
    for xml path('')) 
    ,1,1,'') 

    exec(@sql) 
end 

SQL Fiddle Demo

+0

谢谢你的脚本。但我没有得到如何更新myTable中的记录与上面的字符串味精? – SvenB 2013-04-04 13:19:44

+0

@SvenB - 更新了答案。希望这可以帮助。 – sgeddes 2013-04-04 14:10:45

+0

感谢您的更新和小提琴。现在我需要知道的是将WHERE子句放在哪里才更新给定的ID。 我将ID添加到小提琴[小提琴](http://sqlfiddle.com/#!3/0d6d9/1/1) – SvenB 2013-04-05 07:34:42