【问题标题】:TSQL Update stmt for each column name according to data typeTSQL根据数据类型更新每个列名的stmt
【发布时间】:2013-04-04 10:48:26
【问题描述】:

对于 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、Date 等。

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

谢谢。

【问题讨论】:

    标签: sql sql-server tsql ssis


    【解决方案1】:

    听起来你正在寻找这样的东西:

    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

    您可以根据需要在CASE 语句中添加任意数量的WHEN 子句。此外,您想使用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

    【讨论】:

    • 感谢脚本。但我不明白如何使用上面的字符串 msg 更新 myTable 中的记录?
    • 感谢您的更新和小提琴。现在我只需要知道在哪里放置我的 WHERE 子句以仅更新给定的 ID。我将 ID 添加到小提琴 fiddle
    • 我应该补充一下,我想通了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 2019-11-08
    • 2022-10-22
    相关资源
    最近更新 更多