TSQL根据数据类型为每个列名更新stmt

时间:2013-04-04 10:48:27

标签: sql sql-server tsql ssis

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

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

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

由于我有多个表要处理,我还得到不同的列名和数据类型 我会用这个stmt来获取列名

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

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

在伪代码中,它可能只是一个循环遍历列:如果column_name是data_type“char”,那么......

我还需要忽略每个表的前4列,这样我就不会覆盖ID,日期等。

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

谢谢。

1 个答案:

答案 0 :(得分: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语句,那么您需要使用动态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