在Dynamic SQL中分配函数返回的值

时间:2016-10-25 16:32:36

标签: sql sql-server tsql dynamic-sql sql-function

我正在尝试生成动态SQL,以使用函数中的值分配变量。我正在尝试生成像

这样的SQL
Select @StartDate=@EID_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,
  @EID_Dept=@EID_Dept,
  @today=@today 

1 个答案:

答案 0 :(得分: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,但在为变量指定值时添加Nsp_executesql等待声明部分

中的nvarchar
  

是包含Transact-SQL语句或批处理的Unicode字符串。

我放入@params变量的所有参数。

据我所知,您需要根据@EID_dept获取另一列,因此我添加QUOTENAME并直接在SQL语句构建中使用此变量。您不能将列名称作为变量发送。