2

对于 SSIS,我需要创建一个 TSQL 更新工作流来覆盖当前表记录,以防出现导入错误。

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

因此,如果在导入过程中出现问题,表中的当前记录(所有行)应该用一条短消息更新 - 例如“错误数据库导入”。

因为我有多个表要处理,所以我也会得到不同的列名和数据类型
我会使用这个 stmt 来获取列名

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

但是如何为字符类型设置字符串消息,为数字和日期类型设置 NULL。使用 CASE stmt?

在伪代码中,它可能只是通过列的循环:如果 column_name 是 data_type "char" 那么......

我还需要忽略每个表的前 4 列,以免覆盖 ID、日期等。

如果您可以帮助我设置静态测试更新 stmt,我相信我可以将其转移到我的 SSIS 项目中。

谢谢你。

4

1 回答 1

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 小提琴演示

您可以根据需要WHEN向语句中添加任意数量的子句CASE。此外,您想使用该ORDINAL_POSITION列来排除前 4 列。

如果您需要使用此信息来创建UPDATE语句,那么您需要使用动态 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 小提琴演示

于 2013-04-04T10:52:52.240 回答