首页 > 解决方案 > INSERT INTO @table,其中@table 是一个变量

问题描述

我遇到了一个小问题:我想创建一个在通过参数指定的表中插入一些行的过程。所以沿着代码我已经达到了这一点:

CREATE PROCEDURE my_proc @tableName VARCHAR(30)
AS
    -- ...some code...
    INSERT INTO @tableName VALUES(...some values...)
    -- ...some code...
GO

这不起作用,所以也许我错过了一些东西。

PS:我在 Microsoft SQL Server Management Studio 2018 工作

标签: sqlsql-serverdatabasesql-insert

解决方案


您只能将变量用于查询中的常量,而不能用于标识符。因此,您需要使用动态 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'', . . . )';

这些是重复的单引号 ( ''),而不是双引号 ( ")。


推荐阅读