【问题标题】:INSERT INTO @table, where @table is a variableINSERT INTO @table,其中@table 是一个变量
【发布时间】:2019-11-19 19:48:23
【问题描述】:

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

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 工作

【问题讨论】:

    标签: sql sql-server database sql-insert


    【解决方案1】:

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

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

    【讨论】:

    • 如果在 VALUES 之后我有一些字符串作为参数,我应该如何处理?我想要 set sql = 'insert into [tablename] values ('aaa','xxx')';但是 sql 被中断了
    • 我建议检查数据库中是否存在具有该名称的表。以防万一:)
    • @Norby 。 . .您需要在单引号上加倍。
    • @GordonLinoff 我输入了值 ("aaa","xxx" )',但出现错误:过程需要参数 '@statement' 类型为 'ntext/nchar/nvarchar'。
    猜你喜欢
    • 2010-10-26
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 2015-04-12
    • 2014-05-12
    • 2023-03-18
    • 2011-11-09
    • 1970-01-01
    相关资源
    最近更新 更多