2011-03-08 21 views
0

我試圖挽救自己從一批數據拉SQL腳本中添加大量重複代碼。我正在使用SQL Server。某些類型的每列的SQL應用函數

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

這很簡單。它將使用全部|返回a_varchar_col中的文本由一個空間取代。

但我得到了12個表和100個varchar字段。我不想經過並在每列附近放置一個替代品,因爲它容易出錯,而且我很懶;)

是否有某種方法可以告訴select在varchar類型的所有列上執行替換?

更通用的方式來問這個問題是:

有沒有辦法讓SQL Server自動運行在每一列的一些任意代碼在select語句返回?如果是這樣,你可以過濾某個函數應用於哪些列嗎?

回答

0

我有一個解析函數,我總是通過我的SQL通過。如果它看到數據庫是oracle,它將用「|」替換「+」例如。

但我把我所有的數據庫調用都放到了處理這種管道和其他事情(如錯誤處理和日誌記錄)的類中。因此,我可以編寫SQL,並將其傳遞到我的「GetDataSet」方法中,而不必擔心Oracle不喜歡「+」。

乾杯, 丹尼爾

+0

你可以寫SQL Server腳本類?或者,你的GetDataSet是一個用Java/Python /類編寫的模型類的方法嗎? – srock 2011-03-10 21:00:43

1

這是作秀,並告訴ONLY,我的建議是不要使用它,除非絕對必要:

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 [email protected] 
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(' [email protected] +',''|'','' '' '+ ')' 
    EXEC sp_executesql @sql 

fetch next from columnNamesCursor into @columnName 
END 

CLOSE columnNamesCursor 
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