我遇到了一个小问题:我想创建一个过程,该过程在通过参数指定的表中插入一些行。因此,沿着代码我已经达到了这一点:
CREATE PROCEDURE my_proc @tableName VARCHAR(30)
AS
-- ...some code...
INSERT INTO @tableName VALUES(...some values...)
-- ...some code...
GO
这不起作用,所以也许我丢失了一些东西。
P.S:我正在使用Microsoft SQL Server Management Studio 2018
答案 0 :(得分:0)
您只能将变量用于查询中的常量,而不能用于标识符。因此,您需要使用动态SQL:
declare @sql nvarchar(max);
set @sql = 'insert into [tablename] values ( . . . )';
set @sql = replace(@sql, '[tablename]', quotename(tablename));
exec sp_executesql @sql;
两点。首先,如果您打算使用多部分标识符传递表名,那么quotename()
是不合适的。
更重要的是,在关系数据库中几乎不需要传递这样的表名。如果发现需要这样做,则可能是您的数据模型有问题。我猜您有多个具有相同结构的表,这些表应合并为一个表,而不是多个表。
要处理引号字符串:
set @sql = 'insert into [tablename] values (''aaa'', ''bbb'', . . . )';
那些是重复的单引号(''
),而不是双引号("
)。