C# 语法错误,但复制/粘贴的查询文本在SSMS中有效

C# 语法错误,但复制/粘贴的查询文本在SSMS中有效,c#,sql-server,ssms,sqlexception,verbatim-string,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

我在使用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";
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();  
}
用查询文本填充文本框,然后运行查询的C代码如下所示:

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";
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();  
}
有人知道为什么可以将查询文本复制到SSM并正常运行,但从C#执行时会引发SQL异常吗?如何运行查询?

对查询设计的评论将不胜感激,但我更关心的是简单地让查询执行,因为它做了我需要它做的事情


编辑:这可能是重复的(当“GO”似乎是问题时,我被“IF”附近的错误所吓倒,因此我的搜索方向错误。但是,我仍然不确定类似问题中提供的答案是否有效,因为我的印象是,由于查询引用的后面部分,将查询拆分为多个命令将失败在前面的部分中删除临时表(第一个命令完成后临时表是否不可用?)

这是
GO
语句。在大多数情况下,您可以将其替换为

在TSQL中,可以用
GO
分隔多个语句。在ADO.NET版本中,不能这样做

实现这一点的方法是在运行时将字符串分开,并独立执行每个字符串。例如


这是
GO
语句。在大多数情况下,您可以将其替换为

在TSQL中,可以用
GO
分隔多个语句。在ADO.NET版本中,不能这样做

实现这一点的方法是在运行时将字符串分开,并独立执行每个字符串。例如


有没有一种方法可以使查询在没有GO语句的情况下工作?如果我没有弄错,没有GO语句,查询将无法正常工作(如果我错了,请纠正我)编辑:如果我在GO语句后拆分字符串,我会不会丢失临时表,它会在GO后面的部分中被引用?请尝试使用a;而不是GO,但我不是100%确定。我相信使用分号已经做到了这一点-谢谢!如果您不介意在答案中添加该选项,那么我将继续并标记It作为接受有没有一种方法可以使查询在没有GO语句的情况下工作?如果我没有弄错,没有GO语句,查询将无法正常工作(如果我错了,请纠正我)编辑:如果我在GO语句后拆分字符串,我会不会丢失临时表,它会在GO后面的部分中被引用?请尝试使用a;而不是GO,但我不是100%确定。我相信使用分号已经做到了这一点-谢谢!如果您不介意在答案中添加该选项,那么我将继续并标记I不被接受