powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Теряется табличный параметр при выполнении динамического запроса
12 сообщений из 12, страница 1 из 1
Теряется табличный параметр при выполнении динамического запроса
    #39926433
MsGuns
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, форумчане.

Есть скрипт - болванка для SP:

Код: 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.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
USE [SQLMVCPar]

BEGIN
  DECLARE @Tbl Table(
	[Row_No] [nvarchar](255),
	[Region_Cuntry] [nvarchar](255),
	[No_Cell] [nvarchar](255),
	[No_Fix] [nvarchar](255),
	[FLN] [nvarchar](255),
	[Name_Pos] [nvarchar](255),
	[Name_TO] [nvarchar](255),
	[Address] [nvarchar](255),
	[NROW] [bigint] 
    ) 

  DECLARE @Tbl2 Table (
     ID int,
	 NPage int,
	 NRow bigint
  )

	DECLARE @FilterColName sysname  -- Имя колонки, по которой будет выборка (фильтрация)
    DECLARE @OrderColName sysname   -- Имя колонки, по которой будет упорядочен НД
    DECLARE @FilterValue varchar(max) -- Значение - образец для фильтра
    DECLARE @OrderDirection varchar(4) -- ASC - по возрастанию, DESC - по убыванию
    DECLARE @SearchValue varchar(max)   -- Значение образца (если содержит символы % или *, то поиск Like, иначе - полное совпадение
	DECLARE @QRowsByPage int           -- Количество строк на странице

-- Шаг 1. С помощью SP UsP_SFN выбираются все записи Книги по указанным параметрам
--        Результат помещается во временную таблицу #Tmp1
  
  DECLARE @SQLSearch varchar(max)
  DECLARE @SearchVal varchar(max)
  DECLARE @SQL varchar(max)
  DECLARE @SQLExec varchar(max)



  SET @FilterColName = 'Name_TO'
  SET @OrderColName = 'FLN'
  SET @FilterValue = N'ГУ-Отделение ПФР по г. Москве и Московской области'   
  SET @OrderDirection = 'ASC'
  SET @SearchValue ='Уманский Борис Маркович'

  INSERT INTO @Tbl
  Exec UsP_SFN @FilterColName, @OrderColName, @FilterValue, @OrderDirection

  Select * from @Tbl

-- Шаг 2. Определяется выражение для поиска
  IF @SearchValue = '' 
     SET @SQLSearch = 'Where ' + @OrderColName + 'IS NULL' 
  ELSE
    BEGIN
	  SET @SearchVal = REPLACE(@SearchValue, '*', '%') -- Замена wildcard символа '*' на '%'
	  IF CHARINDEX('%',@SearchVal)>0
         SET @SQLSearch = 'Where ' + @OrderColName + ' LIKE ''' + @SearchVal + ''''
      ELSE
         SET @SQLSearch = 'Where ' + @OrderColName + ' = ''' + @SearchVal + ''''
	END

  -- Работает !
  INSERT INTO @Tbl2 SELECT TOP 1 CAST(Row_No as int) as ID, 0 as NPage, NROW as NRow FROM @Tbl Where FLN = 'Уманский Борис Маркович'

  -- Не работает !! 
  --  Сообщение 1087, уровень 15, состояние 2, строка 1
  --  Необходимо объявить табличную переменную "@Tbl2".
  --  Сообщение 1087, уровень 15, состояние 2, строка 1
  --  Необходимо объявить табличную переменную "@Tbl".
  exec ('INSERT INTO @Tbl2 SELECT TOP 1 CAST(Row_No as int) as ID, 0 as NPage, NROW as NRow FROM @Tbl Where FLN = ''Уманский Борис Маркович''')

  select * from @Tbl2

--  SET @SQLExec = 'SELECT TOP 1 CAST(Row_No as int) as ID, 0 as NPage, NROW as NRow FROM @Tbl ' + @SQLSearch
--  SET @SQL = 'INSERT INTO @Tbl2 '+@SQLExec

--  select @SQL

--  EXEC (@SQL)

--  Select * from @TT
--  SET @SQLExec = 'Exec UsP_SFN ''' + @FilterColName + ''',''' + @OrderColName +''',''' + @FilterValue + ''',''' + @OrderDirection + '';
--  SET @SQL = ' Select * into Tmp from OPENROWSET(''SQLNCLI'',''Server=MSGUNS-PC\MSSQLEXPRESS;Trusted_Connection=yes;'',N'''+ @SQLExec + ''');'

--  select @SQL
--  Exec (@SQL)

END



Комментариями я проставил сообщения об ошибке. Такое впечатление, что при выполнении динамического запроса сервер "забывает" об объявленных параметрах-таблицах. Подскажите, пожалуйста, где косяк.
...
Рейтинг: 0 / 0
Теряется табличный параметр при выполнении динамического запроса
    #39926437
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Область видимости табличных переменных описана в документации.
И ваш код будет работать, если заменить табличную переменную на временную таблицу. Впрочем, об этом тоже написано в хелпе.
...
Рейтинг: 0 / 0
Теряется табличный параметр при выполнении динамического запроса
    #39926442
MsGuns
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кажется разобрался :)

Дело в том, что динамический SQL выполняется как ОТДЕЛЬНЫЙ блок кода и параметров, объявленных в коде, его вызывающем, не видит. Т.е. в моем примере таблицы-параметры @Tbl и @Tbl2 находятся за пределами блока Exec, поэтому-то и не видны.

Заменил таблицы-параметры на временные #Tbl и #Tbl2 и все заработало.

Если будут комментарии, в т.ч. и критические, буду благодарен Мастерам. Розги, тухлые яйца и булыжники не приветствуются, но принимаются :)

Спасибо за любые советы и критику
...
Рейтинг: 0 / 0
Теряется табличный параметр при выполнении динамического запроса
    #39926443
MsGuns
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич,

Когда писал дополнение, Ваш пост не видел. Но он лишь подтвердил мою "догадку" :)
Спасибо, Серега :)
...
Рейтинг: 0 / 0
Теряется табличный параметр при выполнении динамического запроса
    #39926465
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MsGuns
таблицы-параметры @Tbl и @Tbl2
Это никакие не таблицы-параметры.
Это табличные переменные.
...
Рейтинг: 0 / 0
Теряется табличный параметр при выполнении динамического запроса
    #39926576
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MsGuns,

Код: sql
1.
2.
3.
4.
5.
6.
DECLARE @t AS TABLE(i INT NOT NULL);

INSERT INTO @t(i)
EXECUTE ('SELECT 12345678')

SELECT i FROM @t;
...
Рейтинг: 0 / 0
Теряется табличный параметр при выполнении динамического запроса
    #39926818
MsGuns
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iap,
Это ясно, просто выразился неверно, но понимаю верно :) Главное, что с такими переменными можно работать как с обычными таблицами (Select,Insert,Update...), но при этом 'таблица' уничтожится при выходе из ХП. И никаких DROP не требуется.
...
Рейтинг: 0 / 0
Теряется табличный параметр при выполнении динамического запроса
    #39926821
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MsGuns
iap,
Это ясно, просто выразился неверно, но понимаю верно :) Главное, что с такими переменными можно работать как с обычными таблицами (Select,Insert,Update...), но при этом 'таблица' уничтожится при выходе из ХП. И никаких DROP не требуется.

Так и # таблицы "уничтожится при выходе из ХП. И никаких DROP не требуется"
...
Рейтинг: 0 / 0
Теряется табличный параметр при выполнении динамического запроса
    #39926897
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
MsGuns
iap,
Это ясно, просто выразился неверно, но понимаю верно :) Главное, что с такими переменными можно работать как с обычными таблицами (Select,Insert,Update...), но при этом 'таблица' уничтожится при выходе из ХП. И никаких DROP не требуется.

Так и # таблицы "уничтожится при выходе из ХП. И никаких DROP не требуется"
Притом, временные таблицы уничтожаются быстрее, если не делать DROP в конце процедур, если такая особенность у сиквела.
...
Рейтинг: 0 / 0
Теряется табличный параметр при выполнении динамического запроса
    #39926964
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,

Там все не так просто с закешированными планами. Суть: пока план есть, таблица точно есть, а на сдачу еще и данные есть.
Я где-то давно что-то на эту тему приводил, но это не точно.
...
Рейтинг: 0 / 0
Теряется табличный параметр при выполнении динамического запроса
    #39927014
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,

возможны ситуации, при которых сборщик мусора не успевает освобождать страницы tempdb по сравнению со скоростью создания этих таблиц. Это недостаток архитектуры приложения, но случай возможный. В такой ситуации прибегают к "синхронному" удалению таблиц, хотя это может привести к проявлению известного бага, который периодически лечат.
...
Рейтинг: 0 / 0
Теряется табличный параметр при выполнении динамического запроса
    #39927024
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
alexeyvg,

возможны ситуации, при которых сборщик мусора не успевает освобождать страницы tempdb по сравнению со скоростью создания этих таблиц.
Спасибо, интересно, не знал про такое...

А как это проявляется, и какие могут быть последствия?
Что то вроде роста занятого места в tempdb, при высокой нагрузке?
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Теряется табличный параметр при выполнении динамического запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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