语法错误,但复制/粘贴查询文本在SSMS中工作

时间:2016-01-26 00:27:47

标签: c# sql-server ssms sqlexception verbatim-string

我遇到使用C#生成SQL查询的问题。要进行故障排除,我使执行查询的按钮还在表单上的文本框中显示查询文本。令人困惑的是,我收到一条错误说"错误的语法附近' IF'"当程序尝试执行查询时,但如果我将查询从文本框复制/粘贴到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 next=@code_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异常?如何运行查询?

对查询设计的批评将不胜感激,但我更关心的是简单地让查询执行,因为它完成了我需要它按原样执行的操作。

编辑:这可能是重复的(我被错误接近' IF'当看起来' GO'是问题,因此我的搜索是在错误的方向。但是,我仍然不确定类似问题中提供的答案是否会起作用,因为我认为将查询分成多个命令将会失败,因为查询的后面部分引用了前面部分中的临时表(第一个命令完成后,临时表不会变得不可用吗?)。

1 个答案:

答案 0 :(得分:2)

它是GO声明。在大多数情况下,您可以将其替换为;

在TSQL中,可以将多个语句分隔为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
}