2016-01-26 45 views
0

我遇到了使用C#生成SQL查詢的問題。爲了解決問題,我讓執行查詢的按鈕也在窗體上的文本框中顯示查詢文本。有什麼令人困惑的是,當程序試圖執行查詢時,我得到一個錯誤,說「IF'附近有錯誤的語法」,但是如果我將查詢從文本框複製/粘貼到SSMS,它可以正常工作。語法錯誤,但複製/粘貼查詢文本在SSMS中工作

存儲查詢的變量是這樣的:

string myQuery = @" 
SELECT DISTINCT filter.id_column INTO #temp1 
FROM MasterDB.dbo.filter filter 
LEFT JOIN ClientDB.dbo.codes codetable 
ON filter.id_column=codetable.id_column 
WHERE codetable.name IS NULL 

DECLARE @code_id1 INT; 
SET @code_id1 = (SELECT MAX(code_num) FROM ClientDB.dbo.codes)+1 
EXEC('ALTER TABLE #temp1 ADD tempID INT IDENTITY(' + @code_id1 + ',1)') 
GO 

IF (SELECT COUNT(*) FROM #temp1)>0 
BEGIN 
DECLARE @code_id2 INT; 
SET @code_id2 = (SELECT MAX(tempID) FROM #temp1)+1 
UPDATE ClientDB.dbo.track 
SET [email protected]_id2 WHERE [trackname]='account' 
END"; 

的C#代碼與查詢文本填充文本框,然後運行查詢的樣子:

using (SqlConnection myConnection = new SqlConnection(HostConnStr)) 
using (SqlCommand myCommand = myConnection.CreateCommand()) 
{ 
    myCommand.CommandText = myQuery; 
    this.textBox1.Text = myCommand.CommandText; 
    myConnection.Open(); 
    try { myCommand.ExecuteNonQuery(); } 
    catch (SqlException s) { MessageBox.Show(s.ToString()); } 
    myConnection.Close(); 
} 

有誰知道爲什麼查詢文本可以複製到SSMS並運行正常,但從C#執行時拋出SQL異常?我如何使查詢運行?

關於查詢設計的批評將值得讚賞,但我更關心的是簡單地獲取查詢來執行,因爲它執行我所需要的操作。

編輯:這可能是重複的(當'GO'出現問題時,我被'IF'附近的錯誤拋出,所以我的搜索方向錯誤了。但是,我仍然沒有確保類似問題中提供的答案可以工作,因爲我認爲將查詢拆分爲多個命令會失敗,因爲查詢的後面部分引用了前面部分中的臨時表(臨時表是否會在第一個命令完成?)。

+0

的[執行大型SQL腳本(使用GO命令)](可能的複製http://stackoverflow.com/questions/40814/execute-a-large-sql-script-with- go-commands) – BWA

回答

2

這是GO聲明。您可以在大多數情況下與;更換。

在T SQL可以有多個語句分隔GO。在ADO.NET版本中,你不能這樣做。

執行此操作的方法將在GO上溢出字符串並獨立執行。如this example

string scriptText = @"...." 

//split the script on "GO" commands 
string[] splitter = new string[] { "\r\nGO\r\n" }; 
string[] commandTexts = scriptText.Split(splitter, StringSplitOptions.RemoveEmptyEntries); 
foreach (string commandText in commandTexts) 
{ 
    //execute commandText 
} 
+0

有沒有辦法讓查詢在沒有GO語句的情況下工作?如果我沒有弄錯,沒有它,查詢就無法按預期工作(糾正我,如果我錯了)編輯:如果我在GO語句後拆分字符串,我會不會失去我的臨時表,它將在部分引用遵循GO? – elmer007

+0

嘗試使用a;而不是GO,但我不是100%確定的。 –

+1

我相信使用分號已經完成了技巧 - 謝謝!如果您不介意在回答中提供該選項,那麼我會繼續並將其標記爲已接受 – elmer007