Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Теряется табличный параметр при выполнении динамического запроса / 12 сообщений из 12, страница 1 из 1
13.02.2020, 20:19
    #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
13.02.2020, 20:25
    #39926437
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теряется табличный параметр при выполнении динамического запроса
Область видимости табличных переменных описана в документации.
И ваш код будет работать, если заменить табличную переменную на временную таблицу. Впрочем, об этом тоже написано в хелпе.
...
Рейтинг: 0 / 0
13.02.2020, 20:52
    #39926442
MsGuns
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теряется табличный параметр при выполнении динамического запроса
Кажется разобрался :)

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

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

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

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

Когда писал дополнение, Ваш пост не видел. Но он лишь подтвердил мою "догадку" :)
Спасибо, Серега :)
...
Рейтинг: 0 / 0
13.02.2020, 22:02
    #39926465
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теряется табличный параметр при выполнении динамического запроса
MsGuns
таблицы-параметры @Tbl и @Tbl2
Это никакие не таблицы-параметры.
Это табличные переменные.
...
Рейтинг: 0 / 0
14.02.2020, 10:20
    #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
14.02.2020, 17:13
    #39926818
MsGuns
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теряется табличный параметр при выполнении динамического запроса
iap,
Это ясно, просто выразился неверно, но понимаю верно :) Главное, что с такими переменными можно работать как с обычными таблицами (Select,Insert,Update...), но при этом 'таблица' уничтожится при выходе из ХП. И никаких DROP не требуется.
...
Рейтинг: 0 / 0
14.02.2020, 17:15
    #39926821
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теряется табличный параметр при выполнении динамического запроса
MsGuns
iap,
Это ясно, просто выразился неверно, но понимаю верно :) Главное, что с такими переменными можно работать как с обычными таблицами (Select,Insert,Update...), но при этом 'таблица' уничтожится при выходе из ХП. И никаких DROP не требуется.

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

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

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

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

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

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


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