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

Откуда: Сидней
Сообщений: 1197
Добрый день,

Я пытаюсь передать значение в переменную из динамического sql:

DECLARE @MinBoundary DateTime, @s nvarchar(max)
declare @DBName sysname, @TableName sysname
select @DBName = 'MyDB', @TableName = 'MyTable'
	select @s = '
SELECT Convert(DateTime, MIN(PRV.value))
FROM sys.partition_functions AS PF
JOIN sys.partition_parameters AS PP 
	ON PF.function_id = PP.function_id
JOIN sys.types AS T1 
	ON T1.system_type_id = PP.system_type_id
JOIN sys.types AS T2 
	ON T2.user_type_id= PP.user_type_id
JOIN sys.partition_range_values AS PRV 
	ON PP.function_id = PRV.function_id 
   AND PP.parameter_id = PRV.parameter_id
WHERE PF.name IN (''WBC_' + @TableName + '_pf'')'

print @s 

EXECUTE sp_executesql @s, N'@MB DateTime OUTPUT', @MB=@MinBoundary OUTPUT	
PRINT @MinBoundary


На выходе @Minboundary оказывается NULL

Все работатет, если я распечатываю @s запрос и запускаю его следующим образом (это значит что сам запрос правильный):

DECLARE @MinBoundary DateTime
SELECT @MinBoundary = Convert(DateTime, MIN(PRV.value))
FROM sys.partition_functions AS PF
JOIN sys.partition_parameters AS PP 
ON PF.function_id = PP.function_id
JOIN sys.types AS T1 
ON T1.system_type_id = PP.system_type_id
JOIN sys.types AS T2 
ON T2.user_type_id= PP.user_type_id
JOIN sys.partition_range_values AS PRV 
ON PP.function_id = PRV.function_id 
   AND PP.parameter_id = PRV.parameter_id
WHERE PF.name IN ('WBC_MyTable_pf')
select @MinBoundary


Не понимаю, почему лыжи не едут.

Спасибо.
4 май 15, 09:47    [17597304]     Ответить | Цитировать Сообщить модератору
 Re: Передача значения в переменную из динамического запроса  [new]
Glory
Member

Откуда:
Сообщений: 104751
Roust_m
Не понимаю, почему лыжи не едут.

А ничего, что select-ы у вас отличаются ?
Куда присваивается результат 1го select-а по вашему ?
4 май 15, 09:50    [17597307]     Ответить | Цитировать Сообщить модератору
 Re: Передача значения в переменную из динамического запроса  [new]
Roust_m
Member

Откуда: Сидней
Сообщений: 1197
А чем они отличаются? Я распечатал переменную @s из первого примера и использовал ее для селекта во втором. Единственное отличие это то что первый запрос динамический а второй статический.

Результат первого селекта передается в output параметр @MB, который присваевается переменной @MinBoundary
5 май 15, 02:47    [17599836]     Ответить | Цитировать Сообщить модератору
 Re: Передача значения в переменную из динамического запроса  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
Roust_m
Результат первого селекта передается в output параметр @MB
Где это место в коде? Я вижу, что переменная @MB декларируется, но никак не используется. И результаты первого селекта соответсвенно никуда не присваиваются.

Может, вы думаете, что результаты всех запросов в sp_executesql присваиваются по порядку всем переменным, которые в ней определены? :-)
5 май 15, 03:16    [17599841]     Ответить | Цитировать Сообщить модератору
 Re: Передача значения в переменную из динамического запроса  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
Roust_m
А чем они отличаются?

Так видна разница?
SELECT Convert(DateTime, MIN(PRV.value))
SELECT @MinBoundary = Convert(DateTime, MIN(PRV.value))
5 май 15, 03:18    [17599843]     Ответить | Цитировать Сообщить модератору
 Re: Передача значения в переменную из динамического запроса  [new]
Roust_m
Member

Откуда: Сидней
Сообщений: 1197
alexeyvg
Roust_m
А чем они отличаются?

Так видна разница?
SELECT Convert(DateTime, MIN(PRV.value))
SELECT @MinBoundary = Convert(DateTime, MIN(PRV.value))


Ну дык в первом случае у нас динамический sql. Значение в переменную должно передаваться через:
EXECUTE sp_executesql @s, N'@MB DateTime OUTPUT', @MB=@MinBoundary OUTPUT


Как еще из динамического sql можно значение в переменную загнать?
5 май 15, 04:54    [17599851]     Ответить | Цитировать Сообщить модератору
 Re: Передача значения в переменную из динамического запроса  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
DECLARE @MinBoundary DateTime, @s nvarchar(max)
declare @DBName sysname, @TableName sysname
select @DBName = 'MyDB', @TableName = 'MyTable'
	select @s = '
SELECT @MinBoundary = Convert(DateTime, MIN(PRV.value))
FROM sys.partition_functions AS PF
JOIN sys.partition_parameters AS PP 
	ON PF.function_id = PP.function_id
JOIN sys.types AS T1 
	ON T1.system_type_id = PP.system_type_id
JOIN sys.types AS T2 
	ON T2.user_type_id= PP.user_type_id
JOIN sys.partition_range_values AS PRV 
	ON PP.function_id = PRV.function_id 
   AND PP.parameter_id = PRV.parameter_id
WHERE PF.name IN (''WBC_' + @TableName + '_pf'')'

print @s 

EXECUTE sp_executesql @s, N'@MinBoundary DateTime OUTPUT', @MinBoundary OUTPUT	
PRINT @MinBoundary
5 май 15, 06:59    [17599900]     Ответить | Цитировать Сообщить модератору
 Re: Передача значения в переменную из динамического запроса  [new]
o-o
Guest
DECLARE @MinBoundary DateTime, @s nvarchar(max)
declare @DBName sysname, @TableName sysname
select @DBName = 'MyDB', @TableName = 'MyTable'
	select @s = '
SELECT @MB=Convert(DateTime, MIN(PRV.value))
FROM sys.partition_functions AS PF
JOIN sys.partition_parameters AS PP 
	ON PF.function_id = PP.function_id
JOIN sys.types AS T1 
	ON T1.system_type_id = PP.system_type_id
JOIN sys.types AS T2 
	ON T2.user_type_id= PP.user_type_id
JOIN sys.partition_range_values AS PRV 
	ON PP.function_id = PRV.function_id 
   AND PP.parameter_id = PRV.parameter_id
WHERE PF.name IN (''WBC_' + @TableName + '_pf'')'

print @s 

EXECUTE sp_executesql @s, N'@MB DateTime OUTPUT', @MB=@MinBoundary OUTPUT	
PRINT @MinBoundary
5 май 15, 07:11    [17599921]     Ответить | Цитировать Сообщить модератору
 Re: Передача значения в переменную из динамического запроса  [new]
Roust_m
Member

Откуда: Сидней
Сообщений: 1197
o-o
DECLARE @MinBoundary DateTime, @s nvarchar(max)
declare @DBName sysname, @TableName sysname
select @DBName = 'MyDB', @TableName = 'MyTable'
	select @s = '
SELECT @MB=Convert(DateTime, MIN(PRV.value))
FROM sys.partition_functions AS PF
JOIN sys.partition_parameters AS PP 
	ON PF.function_id = PP.function_id
JOIN sys.types AS T1 
	ON T1.system_type_id = PP.system_type_id
JOIN sys.types AS T2 
	ON T2.user_type_id= PP.user_type_id
JOIN sys.partition_range_values AS PRV 
	ON PP.function_id = PRV.function_id 
   AND PP.parameter_id = PRV.parameter_id
WHERE PF.name IN (''WBC_' + @TableName + '_pf'')'

print @s 

EXECUTE sp_executesql @s, N'@MB DateTime OUTPUT', @MB=@MinBoundary OUTPUT	
PRINT @MinBoundary


Спасибо.
5 май 15, 08:12    [17600050]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить