Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Динамический sql + передача в переменную результата / 5 сообщений из 5, страница 1 из 1
16.11.2018, 14:40
    #39734143
zhurs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический sql + передача в переменную результата
Добрый день.
Стоит задача поиска значения типа binary в таблицах в 2 этапа и передать результат в переменную @SubCount:
-формирую набор таблиц во временную таблицу #ReferenceList;
-прохожусь итератором по каждой таблице и ищу нужный текст.

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

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
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;
...
Рейтинг: 0 / 0
16.11.2018, 14:43
    #39734148
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический sql + передача в переменную результата
Код: sql
1.
2.
3.
4.
5.
6.
'IF EXISTS
	(SELECT * FROM ' + quotename(@CurrentTable) + ' WHERE _IDRRef = @SearchText )
BEGIN
	SELECT TOP (1)  @SubCount = _Description FROM ' + quotename(@CurrentTable) + ' WHERE _IDRRef = @SearchText 

END'
...
Рейтинг: 0 / 0
16.11.2018, 15:58
    #39734220
zhurs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический sql + передача в переменную результата
Гавриленко Сергей Алексеевич
Код: sql
1.
2.
3.
4.
5.
6.
'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 не так?
...
Рейтинг: 0 / 0
16.11.2018, 16:18
    #39734241
zhurs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический sql + передача в переменную результата
Спасибо ещё раз.
Проблему решил.
Оказалось, что нужно переписать @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'
...
Рейтинг: 0 / 0
16.11.2018, 16:55
    #39734273
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический sql + передача в переменную результата
zhurs,

@SQLString = N' blah blah'
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Динамический sql + передача в переменную результата / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]