Синтаксическая ошибка, но текст запроса копирования / вставки работает в 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
}