Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Неправильный синтаксис около конструкции в отдельном EXEC  [new]
player95
Member

Откуда:
Сообщений: 21
Доброго времени суток всем! Название темы глуповатое но лучше придумать не мог.
Вопрос в следующем. Есть запрос:
IF((SELECT COUNT(*) FROM (SELECT ID_кор2 FROM tb_отрезки WHERE ID_кор1=5) AS Test)!=1)
BEGIN
PRINT 'больше 1 строки'
    CREATE table #TableQUERY --—— создание временной таблицы
    (ID_соседей int
    )
    insert into #TableQUERY (ID_соседей) 
    SELECT ID_кор2 FROM (SELECT ID_кор2 FROM table WHERE ID_кор1=5)  AS TESTING 
SELECT * FROM #TableQUERY

SET @Testing=(SELECT top 1 ID_соседей FROM #TableQUERY) 

Переменная @Testing объявлена выше, int.
Все очень простенько, все работает. Во временной таблице всего один столбец и 2 строки с 2 значениями. Значения вытаскиваются из другой таблицы. Нужно мне это дело внести в отдельный EXEC. Вношу, но с небольшими изменениями, вместо подставленных там цифр для примера, тут уже запросы с переменными.

EXEC('IF((SELECT COUNT(*) FROM (SELECT ID_кор2 FROM tb_отрезки WHERE ID_кор1=(SELECT top 1 ID_соседа'+@test+' FROM TableTest)) AS Test)!=1)

	BEGIN
	PRINT ''больше 1 строки''
    CREATE table #TableQUERY --—— создание временной таблицы
    (ID_соседей int
    )
    insert into #TableQUERY (ID_соседей) 
    SELECT ID_кор2 FROM (SELECT ID_кор2 FROM tb_отрезки WHERE ID_кор1=5)  AS TESTING 


SET '+@Testing+'=(SELECT top 1 [ID_соседей] FROM #TableQUERY) 

END
ELSE
BEGIN
PRINT ''МЕНЬШЕ ОДНОЙ СТРОКИ''
END'

И вот тут проблема. Конкретно вот в этой строчке: SET '+@Testing+'=(SELECT top 1 [ID_соседей] FROM #TableQUERY) . Когда я ее пишу в EXEC выходит ошибка: Неправильный синтаксис около конструкции "=". Не могу понять что тут неверно, если отдельным запросом вне EXEC все работает. Все остальное также отлично работает, как только я убираю эту строчку. У меня просто не получается в EXEC задать переменной значение. переменная объявлена выше за EXEC, в запросе есть и другие переменные но они работают. Конкретно с этой @Testing не могу понять, понять что не так. Я уже и в ХП закомментировал все что можно чтобы проверить, но никак. Заранее спасибо
10 июн 17, 22:39    [20555878]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис около конструкции в отдельном EXEC  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30800
player95
У меня просто не получается в EXEC задать переменной значение. переменная объявлена выше за EXEC,
Вместо нужно EXEC использовать sp_executesql
player95
в запросе есть и другие переменные но они работают.
Других переменных в запросе нет.

Вы просто не понимаете смысла EXEC

EXEC выполняет строку как программу - компилирует её, передаёт серверу на выполнение.
Другие переменные у вас просто участвуют в формировании этой строки.
А вот переменную @Testing сюда непонятно как воткнуть.
Если переменная @Testing равна, скажем, 7, то вы передаёте серверу для выполнения программу:
SET 7=(SELECT top 1 [ID_соседей] FROM #TableQUERY) 
player95
Нужно мне это дело внести в отдельный EXEC
А вот над этим нужно крепко подумать.
Пока непонятно, зачем тут нужен динамический SQL
10 июн 17, 23:13    [20555920]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис около конструкции в отдельном EXEC  [new]
player95
Member

Откуда:
Сообщений: 21
alexeyvg
Других переменных в запросе нет.

Есть переменная @test. Но мысль я понял. Тогда другой вопрос. Весь этот EXEC нужен потому что у меня при запросах к таблице названия колонок как раз зависят от этой переменной. То есть она у меня как счетчик 1,2,3. Изначально она у меня nvarchar, и чтобы мне изменить цифру я произвожу такие действия:
	SELECT CAST(@test AS int)
	set @test=@test+1
	SELECT CAST(@test AS nvarchar(50))

И вот в таких запросах:
DECLARE @test int
SET @test='1'
SELECT top 1 'ID_соседа'+@test FROM TableTest

У меня выходит ошибка: Ошибка преобразования значения varchar "ID_соседа" в тип данных int.
Вот ее я решить так и не смог. Гугл как раз подсказал что в таком случае нужно использовать EXEC, либо как вы написали sp_executesql. Возможно ли тут обойтись без динамического SQL?
10 июн 17, 23:29    [20555956]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис около конструкции в отдельном EXEC  [new]
player95
Member

Откуда:
Сообщений: 21
DECLARE @test nvarchar(250)*
10 июн 17, 23:31    [20555958]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис около конструкции в отдельном EXEC  [new]
player95
Member

Откуда:
Сообщений: 21
В результате я либо получаю ошибки как в сообщении выше, либо я получаю саму строку. ID_соседа1, но как название столбца SQL это не видит, а нужно чтобы видел.
10 июн 17, 23:33    [20555961]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис около конструкции в отдельном EXEC  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30800
player95
И вот в таких запросах:
DECLARE @test int
SET @test='1'
SELECT top 1 'ID_соседа'+@test FROM TableTest


У меня выходит ошибка: Ошибка преобразования значения varchar "ID_соседа" в тип данных int.
Или делать @test типа строка, или писать 'ID_соседа'+convert(nvarchar, @test)

player95
Весь этот EXEC нужен потому что у меня при запросах к таблице названия колонок как раз зависят от этой переменной. То есть она у меня как счетчик 1,2,3.

Возможно ли тут обойтись без динамического SQL?
Да, тогда нельзя обойтись без динамического SQL.
10 июн 17, 23:36    [20555971]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис около конструкции в отдельном EXEC  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30800
alexeyvg
player95
И вот в таких запросах:
DECLARE @test int
SET @test='1'
SELECT top 1 'ID_соседа'+@test FROM TableTest

У меня выходит ошибка: Ошибка преобразования значения varchar "ID_соседа" в тип данных int.
Или делать @test типа строка, или писать 'ID_соседа'+convert(nvarchar, @test)
Ну и само собой, такой запрос сделать нельзя, тут нужен динамический SQL
10 июн 17, 23:37    [20555973]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис около конструкции в отдельном EXEC  [new]
player95
Member

Откуда:
Сообщений: 21
alexeyvg
А вот переменную @Testing сюда непонятно как воткнуть.
Если переменная @Testing равна, скажем, 7, то вы передаёте серверу для выполнения программу:
SET 7=(SELECT top 1 [ID_соседей] FROM #TableQUERY) 

Есть ли возможность каким то образом получить в эту переменную число с запроса?
10 июн 17, 23:41    [20555981]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис около конструкции в отдельном EXEC  [new]
player95
Member

Откуда:
Сообщений: 21
До меня дошло, я ведь уже такое проделывал, output параметр мне поможет)

EXEC sp_executesql @testing,N'@SOSED NVARCHAR(MAX) OUTPUT', @SOSED output, где @testing это строка запроса.

SELECT @SOSED=(SELECT top 1 [ID_соседей] FROM #TableQUERY)
А это в самом запросе уже. Вроде бы все хорошо)
10 июн 17, 23:50    [20555995]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис около конструкции в отдельном EXEC  [new]
player95
Member

Откуда:
Сообщений: 21
Названия переменных не совпадают, @SOSED эт я другое название подобрал)
10 июн 17, 23:51    [20555999]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис около конструкции в отдельном EXEC  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30800
player95
До меня дошло, я ведь уже такое проделывал, output параметр мне поможет)

EXEC sp_executesql @testing,N'@SOSED NVARCHAR(MAX) OUTPUT', @SOSED output, где @testing это строка запроса.

SELECT @SOSED=(SELECT top 1 [ID_соседей] FROM #TableQUERY)
А это в самом запросе уже. Вроде бы все хорошо)
Да, это я и имел в виду, говоря про sp_executesql.
11 июн 17, 13:27    [20556507]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить