sql - 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 工作
解决方案
您只能将变量用于查询中的常量,而不能用于标识符。因此,您需要使用动态 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'', . . . )';
这些是重复的单引号 ( ''
),而不是双引号 ( "
)。
推荐阅读
- terminal - 需要水平合并两个 .TXT 文件,没有空格,结果在终端中不可见
- git - 有没有办法从 git 获得预合并钩子或类似行为?
- python - python 3 和相关导入的问题
- c++ - 复杂长的老式演员表
- javascript - Lightgallery 不会在 wordpress 中动态加载图库
- python - 基于相同的日期时间将具有值的列从一个数据帧添加到另一个数据帧
- c++ - 试图从 C++ 中的函数“splitoList”将值附加到类 List
- excel - 文本到列日期格式问题
- java - 在为 Android 工件生成的 POM 中排除 Kotlin stdlib 的 testImplementation 依赖项
- java - 使用 resttemplate 编写单元测试以获取流响应