语法错误,但 Copy/Pasted 查询文本在 SSMS 中有效
Syntax Error, but Copy/Pasted Query Text Works in SSMS
我在使用 C# 生成 SQL 查询时遇到问题。为了排除故障,我让执行查询的按钮也在表单的文本框中显示查询文本。令人困惑的是,当程序尝试执行查询时,我收到一条错误消息 "Incorrect syntax near 'IF'",但是如果我 copy/paste 从文本框到 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 异常?以及如何进行查询 运行?
对查询设计的批评将不胜感激,但我更关心的是简单地让查询执行,因为它按原样执行我需要它执行的操作。
编辑:这可能是重复的(当 'GO' 似乎是问题所在时,我被 'IF' 附近的错误所困扰,所以我的搜索方向错误。但是,我仍然不确定类似问题中提供的答案是否有效,因为我的印象是将查询拆分为多个命令会失败,因为查询的后半部分在前半部分引用了临时 table (临时的table不会在第一个命令执行完后不可用吗?)
这是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
}
我在使用 C# 生成 SQL 查询时遇到问题。为了排除故障,我让执行查询的按钮也在表单的文本框中显示查询文本。令人困惑的是,当程序尝试执行查询时,我收到一条错误消息 "Incorrect syntax near 'IF'",但是如果我 copy/paste 从文本框到 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 异常?以及如何进行查询 运行?
对查询设计的批评将不胜感激,但我更关心的是简单地让查询执行,因为它按原样执行我需要它执行的操作。
编辑:这可能是重复的(当 'GO' 似乎是问题所在时,我被 'IF' 附近的错误所困扰,所以我的搜索方向错误。但是,我仍然不确定类似问题中提供的答案是否有效,因为我的印象是将查询拆分为多个命令会失败,因为查询的后半部分在前半部分引用了临时 table (临时的table不会在第一个命令执行完后不可用吗?)
这是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
}