Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Как выполнить подстановку?


Автор: Nickname 20.12.2007, 16:54
Здравствуйте. Мне нужно для MS SQL замутить такую подстановку:
Код

DECLARE @cat NVarChar(255)
SET @cat='AND resumeid=1'
SELECT resumeid, categoryid FROM resumes WHERE 1=1 @cat 

Т.е. вместо @cat должна произойти подстановка, что в результате должно дать, такой запрос
Код

SELECT resumeid, categoryid FROM resumes WHERE 1=1 AND resumeid=1 

но у меня query analizer ругается:
Цитата

Server: Msg 170, Level 15, State 1, Line 3
Line 3: Incorrect syntax near '@cat'.

Автор: mr.DUDA 20.12.2007, 17:34
А если так:
Код
DECLARE @cat NVarChar(255)
SET @cat='AND resumeid=1'

EXEC 'SELECT resumeid, categoryid FROM resumes WHERE 1=1 ' + @cat
GO


(ногами не пинать, давно с SQL Server-ом не работал)

Автор: Nickname 20.12.2007, 17:44
Цитата

DECLARE @cat NVarChar(255)
SET @cat='AND resumeid=1'
EXEC 'SELECT resumeid, categoryid FROM resumes WHERE 1=1 ' + @cat
GO

выдает
Цитата

Server: Msg 170, Level 15, State 1, Line 3
Line 3: Incorrect syntax near 'SELECT resumeid, categoryid FROM resumes WHERE 1=1 '.

Аа понятно - скобки нужно поставить...
EXEC ('SELECT resumeid, categoryid FROM resumes WHERE 1=1 ' + @cat)

А можно ли такую конструкцию подставить в хранимую процедуру?

Автор: mr.DUDA 20.12.2007, 17:49
Цитата(Nickname @  20.12.2007,  17:44 Найти цитируемый пост)
А можно ли такую конструкцию подставить в хранимую процедуру?

Дык это, разве тут не SQL хранимой процедуры приведён? С параметрами. Можно, ИМХО.

Автор: HAL707 20.12.2007, 17:54
Можно подставить что угодно и куда угодно, вопрос в том будет ли работать smile 
В хранимку это конечно подставить можно, однако придется пожертвовать небольшим количеством времени на компиляцию кода при вызове ХП. 
Но так как ты написал (передавать в качестве параметра часть строки запроса), не делают обычно...

Автор: 1stain 20.12.2007, 18:19
а так? (скобки добавить)
Код

DECLARE @cat NVarChar(255)
SET @cat='AND resumeid=1'

EXEC ('SELECT resumeid, categoryid FROM resumes WHERE 1=1 ' + @cat);
GO


Цитата(HAL707 @  20.12.2007,  17:54 Найти цитируемый пост)
Но так как ты написал (передавать в качестве параметра часть строки запроса), не делают обычно...

вполне нормальная конструкция, как на мой взгляд. Например, нам надо периодически выполнить некоторые процедуры в определенном порядке, имена которых содержаться в некоторой таблице. Открываем курсор для выборки имен нужных процедур и вперед... Таким образом легко можно добавлять новую функциональность в бизнес-логику

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)