Синтаксическая ошибка, но текст запроса копирования / вставки работает в SSMS

У меня возникла проблема при создании запроса SQL с использованием C#. Чтобы устранить неполадки, я сделал кнопку, которая выполняет запрос, также отображать текст запроса в текстовом поле на форме. Что сбивает с толку, так это то, что я получаю сообщение об ошибке "Неверный синтаксис рядом с" 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 и работает нормально, но выдает исключение SQL при выполнении из C#? И как мне выполнить запрос?

Критика в отношении дизайна запроса будет принята с благодарностью, но я больше заинтересован в том, чтобы просто выполнить запрос, поскольку он выполняет то, что мне нужно, чтобы он выполнялся как есть.

РЕДАКТИРОВАТЬ: Это может быть дубликат (я был сбит с толку ошибкой, когда рядом с "ЕСЛИ", когда кажется, что "GO" является проблемой, поэтому мои поиски были в неправильном направлении. Однако я все еще не уверен, что ответы при условии, что подобные вопросы будут работать, так как у меня сложилось впечатление, что разделение запроса на несколько команд завершится неудачно из-за того, что более поздняя часть запроса ссылается на временную таблицу в предыдущей части (не станет ли временная таблица недоступной после первой команды законченный?).

1 ответ

Решение

Это GO заявление. Вы можете заменить его на ; в большинстве случаев.

В TSQL нормально иметь несколько операторов, разделенных GO, В версии ADO.NET вы не можете сделать это.

Способ сделать это будет пролить строку на GO и выполнить каждый независимо. Например, этот пример

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
}
Другие вопросы по тегам