我正在尝试生成动态SQL,以使用函数中的值分配变量。我正在尝试生成像
这样的SQLSelect @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
答案 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
,但在为变量指定值时添加N
。 sp_executesql
等待声明部分
nvarchar
是包含Transact-SQL语句或批处理的Unicode字符串。
我放入@params
变量的所有参数。
据我所知,您需要根据@EID_dept
获取另一列,因此我添加QUOTENAME并直接在SQL语句构建中使用此变量。您不能将列名称作为变量发送。