2016-10-25 3 views
2

Я пытаюсь создать динамический SQL для назначения переменных со значениями из функции. Я пытаюсь создать что-то вроде SQLНазначение значений, возвращаемых функцией в Dynamic SQL

Select @[email protected]_Dept 
from dbo.WorkHistory(@today,@EID) 

Функция возвращает дату (@EID_dept будет имя столбца, возвращаемого функцией), который мне нужно назначить @StartDate. И @EID_Dept генерируется путем конкатенации @EID и @dept.

Если я вручную писать SQL это будет выглядеть как

Select @StartDate = amaan_IT 
from dbo.WorkHistory('2016-10-10', amaan) 

Мой код ниже:

DECLARE @EID varchar(5), @StartDate VARCHAR(MAX), 
     @today DATETIME, @dept VARCHAR(10), @EID_dept varchar(20); 

Select @today = SYSDATETIME() 
Select @dept = dept from dbo.Dept(@EID) 
Select @EID_Dept = CONCAT(@EID, @dept) 

DECLARE @SQL Varchar(max); 
SET @SQL = N'Select @StartDate = @EID_Dept 
      from dbo.PeriodHistory(@today, @EID)'; 

EXEC Sp_executesql 
    @SQL, 
    N'@StartDate VARCHAR(MAX) out,@EID_dept varchar(max),@today datetime,@EID Varchar', 
    @StartDate out, 
    @[email protected]_Dept, 
    @[email protected] 
+4

Почему вы используете динамический sql вообще? Это ничего не делает для вас, кроме как сделать это более трудным. –

+0

Вы не можете назначать имена объектов с помощью переменных, вам нужно будет использовать 'SET @SQL = CONCAT (N'SELECT @StartDate = ', @EID_Dept,' FROM dbo.PeriodHistory (@Today, @EID);'). Это кажется далеким от идеала, хотя, я не уверен, что вы делаете это наилучшим образом. – GarethD

+0

EID будет меняться, и мне нужно объединить EID n Dept, чтобы получить данные из функции. Просто EID будет передан, используя EID, мне нужно найти Dept, а затем объединить оба. –

ответ

1

Я изменил запрос немного. Надеюсь, что это будет работать нормально:

DECLARE @EID nvarchar(5), 
     @StartDate nvarchar(MAX), 
     @today datetime = SYSDATETIME(), 
     @dept nvarchar(10), 
     @EID_dept nvarchar(20), 
     @SQL nvarchar(max), 
     @params nvarchar(max) = N'@StartDate nvarchar(MAX) out, @today datetime, @EID nvarchar(5)' 

Select @dept = dept from dbo.Dept(@EID) 
Select @EID_Dept = CONCAT(@EID, @dept) 

SET @SQL = N'Select @StartDate = ' + QUOTENAME(@EID_dept) + ' from dbo.PeriodHistory(@today, @EID);'; 

EXEC sp_executesql @SQL, 
        @params, 
        @StartDate = @StartDate out, 
        @today = @today, 
        @EID = @EID 

SELECT @StartDate 

Я использовал nvarchar(max) для @SQL (вы используете varchar но добавление N когда присвоить значение переменной). sp_executesql ждет nvarchar в заявлении часть

Является ли строка Unicode, которая содержит инструкцию Transact-SQL или пакет.

Все параметры, которые я задал в @params переменных.

Как я понял, вам нужно получить другие столбцы на основе @EID_dept, поэтому я добавляю QUOTENAME и использую эту переменную непосредственно в SQL-выражении. Вы не можете отправить имя столбца в качестве переменной.

Смежные вопросы