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

Откуда:
Сообщений: 3
Добрый день.
Стоит задача поиска значения типа binary в таблицах в 2 этапа и передать результат в переменную @SubCount:
-формирую набор таблиц во временную таблицу #ReferenceList;
-прохожусь итератором по каждой таблице и ищу нужный текст.

Возникает ошибка
Must declare the table variable "@CurrentTable".
Msg 1087, Level 16, State 1, Line 2


При этом если не передавать в переменную, то всё получается.
Подскажите, пожалуйста, что я не так делаю? Жирным выделил место, где, на мой взгляд, есть проблема:

USE process1C;

IF object_id(N'tempdb..#ReferenceList',N'U') IS NOT NULL DROP TABLE #ReferenceList
CREATE TABLE #ReferenceList
	(ReferenceTbName VARCHAR(30));

INSERT INTO #ReferenceList
SELECT TABLE_NAME FROM empty_base.INFORMATION_SCHEMA.TABLES
	WHERE TABLE_NAME LIKE '_Reference[0-9]%' AND TABLE_NAME NOT LIKE '%[0-9]_VT[0-9]%'


USE empty_base;

DECLARE
	@SearchTextBinary binary(16),
	@SearchText VARCHAR(max),
	@SQLString nvarchar(400),
	@CurrentTable nvarchar(100),
	@SubCount nvarchar(max);

SET @SearchTextBinary = 0xBD55BC855654353211E8D912F34E1AED
SET @SearchText = CONVERT(varchar(max), @SearchTextBinary, 1)

DECLARE CursorSearch CURSOR FAST_FORWARD
		FOR SELECT ReferenceTbName FROM #ReferenceList;
OPEN CursorSearch

FETCH NEXT FROM CursorSearch
	INTO @CurrentTable
	WHILE @@FETCH_STATUS=0

BEGIN

SET @SQLString = 
'IF EXISTS
	(SELECT * FROM @CurrentTable WHERE _IDRRef = @SearchText )
BEGIN
	SELECT TOP (1)  @SubCount = _Description FROM @CurrentTable WHERE _IDRRef = @SearchText 

END'

	IF	COL_LENGTH(@CurrentTable,'_Description') > 0
		EXECUTE sp_executesql @SQLString, N'@CurrentTable nvarchar (100), @SearchText VARCHAR(max), @SubCount nvarchar(max) OUTPUT', @CurrentTable, @SearchText, @SubCount OUTPUT;

		FETCH NEXT FROM CursorSearch INTO @CurrentTable
END

CLOSE CursorSearch;
DEALLOCATE CursorSearch;

Print @SubCount;


Сообщение было отредактировано: 16 ноя 18, 14:42
16 ноя 18, 14:40    [21736427]     Ответить | Цитировать Сообщить модератору
 Re: Динамический sql + передача в переменную результата  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36691
'IF EXISTS
	(SELECT * FROM ' + quotename(@CurrentTable) + ' WHERE _IDRRef = @SearchText )
BEGIN
	SELECT TOP (1)  @SubCount = _Description FROM ' + quotename(@CurrentTable) + ' WHERE _IDRRef = @SearchText 

END'
16 ноя 18, 14:43    [21736434]     Ответить | Цитировать Сообщить модератору
 Re: Динамический sql + передача в переменную результата  [new]
zhurs
Member

Откуда:
Сообщений: 3
Гавриленко Сергей Алексеевич
'IF EXISTS
	(SELECT * FROM ' + quotename(@CurrentTable) + ' WHERE _IDRRef = @SearchText )
BEGIN
	SELECT TOP (1)  @SubCount = _Description FROM ' + quotename(@CurrentTable) + ' WHERE _IDRRef = @SearchText 

END'


Спасибо за подсказку, Сергей.
Этот вариант я тоже пробовал.
Такой вариант не выдаёт ошибку, но и не заносит результат sp_executesql в переменую @SubCount.
Может, что-то в sp_executesql не так?
16 ноя 18, 15:58    [21736535]     Ответить | Цитировать Сообщить модератору
 Re: Динамический sql + передача в переменную результата  [new]
zhurs
Member

Откуда:
Сообщений: 3
Спасибо ещё раз.
Проблему решил.
Оказалось, что нужно переписать @SearchText в стркоке запросат таким образом (возможно, какие-то особенности, связанные с типом binary и его преобразованием в обычную строку):

SET @SQLString =
'IF EXISTS
(SELECT * FROM ' + quotename(@CurrentTable) + ' WHERE _IDRRef = ' + @SearchText + ' )
BEGIN
SELECT TOP (1) @SubCount = _Description FROM ' + quotename(@CurrentTable) + ' WHERE _IDRRef = ' + @SearchText + '

END'
16 ноя 18, 16:18    [21736570]     Ответить | Цитировать Сообщить модератору
 Re: Динамический sql + передача в переменную результата  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7392
zhurs,

@SQLString = N' blah blah'
16 ноя 18, 16:55    [21736615]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить