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

Откуда:
Сообщений: 1010
Вот такой код:
Declare @Res VarChar(50)
Declare @TextZP VarChar(2000)
SET @TextZP = 'SELECT TOP 1 SP5069 FROM DH2254 AS T1 WITH (NOLOCK) WHERE T1.IDDOC = ''   2DZ   '''
--PRINT @TextZP
EXEC @TextZP

В ответ сообщает:
Could not find stored procedure 'SELECT TOP 1 SP5069 FROM DH2254 AS T1 WITH (NOLOCK) WHERE T1.IDDOC = ' 2DZ ''.
Хотя сам по себе зарпос выполняется без проблем:
SELECT TOP 1 SP5069 FROM DH2254 AS T1 WITH (NOLOCK) WHERE T1.IDDOC = '   2DZ   '

В чем может быть проблема?

p.s. Результатом всего должно быть присвоение переменной @Res результата запроса из строки.
22 дек 11, 23:59    [11812183]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008 EXEC @ТекстоваяПеременная - пишут что не найдена хранимая процедура, что не так?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Динамический запрос вызывается так
EXEC(@TextZP)
А EXEC без скобок - это вызов процедуры
23 дек 11, 00:01    [11812188]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008 EXEC @ТекстоваяПеременная - пишут что не найдена хранимая процедура, что не так?  [new]
Pvase
Member

Откуда:
Сообщений: 1010
Спасибо, но теперь пишет:
Invalid use of a side-effecting operator 'EXECUTE STRING' within a function.

Видимо потому что использую внутри функции, а как же быть, если надо?

Суть задачи - получить из таблицы по полю значение. Название поля и название таблицы - храниться в отдельной таблице. Т.е. Надо сделать выборку из заведома неизвестной таблицы из неизвестного поля.
23 дек 11, 00:06    [11812195]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008 EXEC @ТекстоваяПеременная - пишут что не найдена хранимая процедура, что не так?  [new]
Pvase
Member

Откуда:
Сообщений: 1010
Есть таблица, в которой занесены название полей таблиц и название самых таблиц. В зависимости от кода этих таблиц надо выбирать значения из различных полей. Фактически это все можно сделать через CASE, но тогда он разрастается до количества таблиц, а это может быть >= 80 таблиц, а соответственно и условий в CASE. Не будет ли это замедлением, если скажем код таблицы будет аж в конце конструкции CASE?
23 дек 11, 00:09    [11812200]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008 EXEC @ТекстоваяПеременная - пишут что не найдена хранимая процедура, что не так?  [new]
Pvase
Member

Откуда:
Сообщений: 1010
Сейчас функция выглядит так:
CREATE FUNCTION [dbo].[Графа_НомерВходящий] (@IdVidDoc Int, @IDDOC Char(9))
	RETURNS VarChar(2000)
	AS
BEGIN
	Declare @Res VarChar(50)
	Declare @TextZP VarChar(2000)
	Declare @Поле VarChar(50)
	Declare @Табл VarChar(50)
	SELECT TOP 1 @Поле = T.Поле, @Табл = T.Таблица FROM dbo.tbl_ЖурналГрафыПоля AS T WITH (NOLOCK) WHERE (T.IDDOCDEF = @IdVidDoc) AND (T.Графа = 'НомерВходящий')
	IF ISNULL(@Поле,'') <> ''
	Begin
		SET @TextZP = 'SELECT
		TOP 1 @Res = T1.'+@Поле+'
		FROM '+@Табл+' AS T1 WITH (NOLOCK)
		WHERE T1.IDDOC = '''+@IDDOC+''''
		EXEC(@TextZP)
	End
	RETURN(@Res)
END

Но не работает. Если переписывать через CASE - будут ли тормоза, ведь скорее всего сравнение будет идти от первого до последнего WHEN?
23 дек 11, 00:11    [11812203]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008 EXEC @ТекстоваяПеременная - пишут что не найдена хранимая процедура, что не так?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Pvase
Видимо потому что использую внутри функции, а как же быть, если надо?

Никак.
Список разрешенных в функциях команд приведен в хелпе
23 дек 11, 00:14    [11812208]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008 EXEC @ТекстоваяПеременная - пишут что не найдена хранимая процедура, что не так?  [new]
Pvase
Member

Откуда:
Сообщений: 1010
И хранимую процедуру нельзя использовать. Получается выход только один - функция с конструкцией CASE @Param WHEN ... END. Может есть другие варианты для решения этой задачи в MS SQL 2008?
23 дек 11, 12:36    [11814221]     Ответить | Цитировать Сообщить модератору
 Re: SQL 2008 EXEC @ТекстоваяПеременная - пишут что не найдена хранимая процедура, что не так?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Pvase
И хранимую процедуру нельзя использовать. Получается выход только один - функция с конструкцией CASE @Param WHEN ... END. Может есть другие варианты для решения этой задачи в MS SQL 2008?

- Не писать универсальных функций
- Изменить схему данных
23 дек 11, 12:41    [11814279]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить