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

2 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
Run Code Online (Sandbox Code Playgroud)

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

消息402,级别16,状态1,过程ProcAddDate,第7行
数据类型varchar(max)和日期在add运算符中不兼容.

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

Dam*_*ver 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
Run Code Online (Sandbox Code Playgroud)

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

  • @ cybernomad1993 - 你有多个表(显然)具有相同的结构并以相同的方式处理.当发生这种情况时,通常发生的是*数据*的一部分已嵌入表名中.例如,组织通常不应该有"MaleEmployees"和"FemaleEmployees"表.他们应该有一个"员工"表和一个性别的附加列.在我看到人们参数化表格的大约95%的情况下,这就是发生的事情. (2认同)