如何使动态SQL插入'date'变量?

时间:2015-08-05 07:15:13

标签: sql-server stored-procedures

我在SQL Server 2014中创建了这个存储过程

create procedure ProcAddDate
    @tableName varchar(10),
    @inpDate date
as
    declare @sqlInsString varchar(max)

    set @sqlInsString = 'insert into '+ @tableName + ' values('
    set @sqlInsString = @sqlInsString + @inpDate + ')'

    execute(@sqlInsString)
go

但是,当我尝试执行此语句时,SQL Server会抛出错误

  

Msg 402,Level 16,State 1,Procedure ProcAddDate,Line 7
  数据类型varchar(max)和日期在add运算符中不兼容。

如何通过输入'date'类型的值来创建一个允许我向表添加日期的存储过程?

1 个答案:

答案 0 :(得分:7)

如果 要执行此操作(如果您要对表名进行参数化,则通常是数据模型损坏的标志),请使用sp_executesql以便您可以使用正确的类型传递数据(不受干扰)(而不是强制进入然后退出字符串):

create procedure ProcAddDate
@tableName sysname,
@inpDate date
as
    declare @sqlInsString nvarchar(max);
    set @sqlInsString = N'insert into '+ @tableName + ' values(@inpDate)';
    declare @parms nvarchar(max);
    set @parms = N'@inpDate date';
    execute sp_executesql @sqlInsString,@parms,@inpDate;
go

(我还对上述内容做了一些其他的风格修改)