迭代我的SQL表中的每一列

时间:2014-06-24 15:50:09

标签: sql sql-server tsql foreach

我有一个包含大约50列的SQL表。我希望能够遍历每个类似于foreach循环的循环。当我遍历每一列时,我想查看是否在末尾附加了一个双引号,如果是,则删除它。

我已经构建了这个解决方案,但我明确定义了列名,见下文:

select BrandName = 
   (CASE
        WHEN (BrandName like '%"') THEN LEFT(BrandName, LEN(BrandName) - 1)
        ELSE BrandName
    END),
    emailSubject = 
   (CASE
        WHEN (emailSubject like '%"') THEN LEFT(emailSubject , LEN(emailSubject ) - 1)
        ELSE emailSubject 
    END),
    -- and so on...
    from tableName

这很好用,但引入了一些错误的可能性。所以,这就是我想做(伪代码)的原因:

foreach column c in table
    if (c.EndsWith('"'))
        c.RemoveEndCharacter()

这可能,如果是这样,你能提供一些关于如何在T-SQL中实现这样一个解决方案的例子吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

您可以使用以下代码生成tsql语句来更新表。执行该语句,然后将输出复制/粘贴到新的查询窗口并运行。或者,您可以使用下面的查询来查找游标并在每次迭代时执行输出。

SELECT 'UPDATE [' + c.TABLE_SCHEMA + '].[' + c.TABLE_NAME + '] SET [' + c.COLUMN_NAME + '] = LEFT([' + c.COLUMN_NAME + '], LEN([' + c.COLUMN_NAME + ']) - 1) WHERE [' + c.COLUMN_NAME + '] LIKE ''%"'''
FROM INFORMATION_SCHEMA.COLUMNS c
JOIN INFORMATION_SCHEMA.TABLES t
    ON t.TABLE_SCHEMA = c.TABLE_SCHEMA
    AND t.TABLE_NAME = c.TABLE_NAME

--For simple demo purposes, assume tables only.
WHERE t.TABLE_TYPE = 'BASE TABLE'

--Did I miss any data types?
AND c.DATA_TYPE IN ('NVARCHAR', 'VARCHAR', 'NCHAR', 'CHAR')

--Replace values with your corresponding schema/table name.
AND c.TABLE_SCHEMA = 'dbo'
AND c.TABLE_NAME = 'YourTableName'

ORDER BY c.TABLE_SCHEMA, c.TABLE_NAME, c.ORDINAL_POSITION