我是新來的SQLServer腳本(通常是C++開發人員),並會很感激有點幫助。SQLServer的條件執行「EXEC」如果一列中存在
我試圖在一個SQL Server數據庫中包含一個「PROJID」列中的所有表進行「查找和替換」更新。我真的在努力尋找一種方法來做到這一點,不向我報告:
消息207,級別16,狀態1,行1無效的列名稱PROJID「。
我執行語句是:
EXEC
(
'IF EXISTS(SELECT * FROM sys.columns WHERE name = N''PROJID'' AND Object_ID = Object_ID(N''' + @TableName + '''))' +
' BEGIN' +
' UPDATE ' + @TableName +
' SET ' + @ColumnName + ' = REPLACE(' + @ColumnName + ',''' + @ReplaceIDStr + ''',''' + @FindIDStr + ''')' +
' WHERE ' + @ColumnName + ' LIKE ''' + @ReplaceIDStr + '''' + ' AND PROJID = ''1000''' +
' END'
)
我一直在使用也嘗試:
'IF COL_LENGTH(''' + @TableName + ''',''PROJID'') IS NOT NULL' +
而不是列,存在檢查上面。這仍然給我「無效的列名稱」消息。
我會很樂意將列並存檢查執行Exec聲明之外,但我不知道如何去任何這樣做。
謝謝@Jeremy。這是一個我迄今爲止沒有遇到的新奇想法。我最好選擇一步操作,因爲我需要將我的SQL發送給客戶來修復他們的數據,但我會稍微研究一下您的方法,因爲這可能有一些優點。 –
@Coder_Dan我添加了一個使用遊標的版本來完成每次更新。這工作更好一點?請注意,如果您有權訪問有問題的數據庫,則可以運行第一個版本,抽查結果,然後只發送生成的腳本。 –
對不起,我提交的代碼只是我的SQL的一個片段。我在整個過程中有2個循環,一個迭代地爲每個表分配TableName,另一個迭代地將ColumnName分配給表中的所有列。這是基於本頁介紹的技術:http://blogs.thesitedoctor.co.uk/tim/2010/02/19/Search+Every+Table+And+Field+In+A+SQL+Server+Database + Updated.aspx @ColumnName不應該代表一個有效的列 - 事實上,當我在EXEC語句中運行這個簡單的查詢時,它運行良好。 –