【问题标题】:Table as parameter in SQL Server表作为 SQL Server 中的参数
【发布时间】:2013-12-02 15:01:31
【问题描述】:

我有以下存储过程:

 ALTER procedure [dbo].[jk_insertAllLocation]
     @locationTbl as locationTable readonly,
     @TableName varchar(100)
 as
    declare @tbl as locationTable, @sql nvarchar(max)
    begin
    set @sql = N'insert into '+ @tbl + 'select * from ' + @locationTbl +
    'delete c
    from @tbl  c 
    inner join'+ @TableName + 'ON '+@TableName+ '.location_id=c.location_id'
    exec sp_executesql @sql

    set @sql= N'insert into'+ @TableName+ '(location_id,name,address,latitude,longitude,distance,state,sub_cat,id_cat,icon_link,checkinsCount,IDSearch)
    select * from '+ @tbl
    exec sp_executesql @sql

    select id,location_id from lebanon
  end

我不断得到:

必须声明标量变量“@tbl”。
必须声明标量变量“@locationTbl”。

它们已经被声明了..

我认为问题在于它们不是要连接的字符串的表,但我必须将表名作为参数 @TableName 传递,并且我在使用 inner joininsert 的 2 个单独查询中使用此表名那我该怎么做呢?我在谷歌上找不到任何东西

我错过了什么吗?

【问题讨论】:

  • 尝试将declare 语句放在begin/end 块内
  • @Andomar nop 它不起作用 :) 我总是将声明放在开始/结束块之外,它工作正常......我不认为这是问题
  • 我还没有完全清醒,但我很确定你在尝试将 locationTable (@tbl) 连接到 nvarchar(max) 变量 (@ 987654330@).
  • @LittleBobbyTables 是的,我认为这是问题所在,但我必须将表名作为参数 @TableName 传递,并且我在使用 inner joininsert 的 2 个单独的查询中使用此表名,所以我怎样才能做到这一点?我在谷歌上找不到任何东西
  • @tbl 为空,因此您的整个连接语句为空。但是,我不想将表名发送到这样的 proc,如果您觉得有必要这样做,那肯定是糟糕的数据库设计的迹象。

标签: sql sql-server-2008 execute sqlparameter


【解决方案1】:

将声明这些变量的行移到begin 行之后。还有其他问题,但我认为这至少会将错误消息更改为更有帮助的内容。

另外,这让我害怕,因为它可能容易受到 sql 注入攻击。

【讨论】:

    猜你喜欢
    • 2022-08-23
    • 2023-03-22
    • 2018-11-27
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    相关资源
    最近更新 更多