SQL应用函数用于特定类型的每个列

时间:2011-03-08 16:42:38

标签: sql sql-server

我正在努力避免将大量重复代码添加到一组数据拉动SQL脚本中。我正在使用SQL Server。

select 
    some_int_col, 
    replace(a_varchar_col,'|',' ')
from
    test_table

这很简单。它将使用all返回a_varchar_col中的文本被一个空格所取代。

但我有12个表和100个varchar字段。我不想通过并在每个列周围进行替换,因为它容易出错并且我很懒;)

有没有办法告诉select在varchar类型的所有列上执行替换?

提出这个问题的更通用的方法是:

有没有办法让SQL Server在select语句中返回的每一列上自动运行一些任意代码?如果是这样,您可以过滤某个函数应用于哪些列吗?

3 个答案:

答案 0 :(得分:1)

这是为了展示和告诉我,除非绝对必要,否则我的建议是不要使用它:

  DECLARE @tableName VARCHAR(100)
SET @tableName = 'interiors'
DECLARE @columnName VARCHAR(100)
DECLARE columnNamesCursor CURSOR FOR 
SELECT 
c.name AS column_name
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
WHERE t.name=@tableName
AND SCHEMA_NAME(schema_id) = 'dbo'
AND c.system_type_id = 167

OPEN columnNamesCursor

fetch next from columnNamesCursor into @columnName
while @@fetch_status = 0
BEGIN
    DECLARE @sql NVARCHAR(MAX)
    SET @sql = ''
    SET @sql = 'UPDATE ' + @tablename + ' SET ' + @columnName + ' = ' + 'replace(' +@columnName +',''|'','' '' '+ ')'
    EXEC sp_executesql @sql

 fetch next from columnNamesCursor into @columnName
END

CLOSE columnNamesCursor

答案 1 :(得分:1)

这可能不是最佳解决方案,但这可能会加快您的脚本创建速度。您只需将列名粘贴到脚本中即可

    SELECT 
        Case
            When systypes.name = 'varchar' then
                'replace(' + sysColumns.name + ',' + '''' + 'Replace' + '''' + ', ' + '''' + 'WithThis'''  + '),'
            else    sysColumns.Name + ','
        End,
--       column_name = syscolumns.name,  datatype=systypes.name     
    FROM sysobjects 
        JOIN syscolumns ON sysobjects.id = syscolumns.id
        JOIN systypes ON syscolumns.xtype=systypes.xtype
       WHERE
        sysobjects.xtype='U'    and systypes.Name <> 'sysname'
        and sysobjects.name = 'YourTableName'
ORDER BY sysobjects.name,syscolumns.colid

答案 2 :(得分:0)

我有一个解析函数,我总是通过我的SQL。如果它看到db是oracle,它将“+”替换为“|”例如。

但是我将所有的db调用都包装到处理这个管道的类中,以及其他诸如错误处理和日志记录之类的东西。因此,我可以编写SQL,将其传递给我的“GetDataSet”方法,并且永远不必担心Oracle不喜欢“+”。

干杯, 丹尼尔