我正在努力避免将大量重复代码添加到一组数据拉动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语句中返回的每一列上自动运行一些任意代码?如果是这样,您可以过滤某个函数应用于哪些列吗?
答案 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不喜欢“+”。
干杯, 丹尼尔