2016-01-26 4 views
0

У меня возникла проблема с созданием SQL-запроса с использованием C#. Чтобы устранить неполадки, я сделал кнопку, которая выполняет запрос, также отображает текст запроса в текстовом поле в форме. Что вызывает недоумение, так это то, что я получаю сообщение об ошибке «Неправильный синтаксис рядом с« IF », когда программа пытается выполнить запрос, но если я копирую/вставляю запрос из текстового поля в SSMS, он отлично работает.Ошибка синтаксиса, но текст текста с копированием/вставкой в ​​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 [email protected]_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#? И как сделать запрос запущенным?

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

EDIT: Это может быть дубликат (я был сброшен ошибкой, находящейся рядом с «IF», ​​когда появляется сообщение «GO», поэтому мои поиски были в неправильном направлении. что ответы, предоставленные в похожих вопросах, будут работать, так как у меня создается впечатление, что разделение запроса на несколько команд завершится неудачно из-за более поздней части запроса, ссылающегося на временную таблицу в предыдущей части (временная таблица не будет недоступна после первая команда закончена?).

+0

Возможный дубликат [Execute большой SQL скрипт (с командами GO)] (http://stackoverflow.com/questions/40814/execute-a-large-sql-script-with- go-commands) – BWA

ответ

2

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

в Т SQL это нормально, чтобы иметь несколько операторов, разделенных 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 
} 
+0

Есть ли способ заставить запрос работать без инструкции GO? Если я не ошибаюсь, запрос не будет функционировать так, как предполагалось, без него (исправьте меня, если я ошибаюсь). EDIT: если я разделил строку после инструкции GO, я не потеряю свою временную таблицу, на которую ссылаются в разделе что следует за GO? – elmer007

+0

Попробуйте использовать; вместо GO, но я не уверен на 100%. –

+1

Я считаю, что использование точки с запятой сделало трюк - спасибо! Если вы не возражаете использовать этот вариант в своем ответе, тогда я пойду и отметю его как принятый – elmer007