【问题标题】:SQL 2000 Table Name as variable in stored procedureSQL 2000 表名作为存储过程中的变量
【发布时间】:2009-03-16 13:43:06
【问题描述】:

表名:
RM_master

字段:
cust_no
账户号
账户代码

问题是,我想让表RM_master作为存储过程的参数中的变量?

这没有语法错误,但是当我通过右键单击存储过程名称在查询分析器中执行此操作时,未识别变量表名称 (RM_master)
这是我的存储过程;

CREATE PROCEDURE RMQUERY

  @cusnumber  nvarchar (255) = '' ,
  @acctnumber nvarchar (255) = '' ,
  @master nvarchar (255) = ''

AS

BEGIN

SET @CUSNUMBER = @CUSNUMBER
DECLARE @RMRM AS NVARCHAR (255)
SET @RMRM =n'SELECT * FROM' + @MASTER + 'WHERE ACCT_NO =' + @ACCTNUMBER

EXEC RMQUERY2 
END

【问题讨论】:

  • 有人可以格式化存储过程吗?

标签: sql stored-procedures parameters dynamic-sql tablename


【解决方案1】:

不建议这样做,因为您只是在存储过程中创建动态 sql。这会打开 sql 注入后门,因为您不了解输入创建的 sql:参数值本身不应用作查询元素,而只能用作查询中的值(可以动态创建,但始终应使用参数)。

如果必须的话,您应该使用外部存储过程 sp_executesql 并将 sql 提供给该过程。

【讨论】:

    【解决方案2】:

    你没有给@master赋值。

    【讨论】:

      【解决方案3】:

      您可能需要在表名前后添加空格,否则它将如下所示:

      SELECT * FROMTABLENAMEWHERE ACCT_NO =0
      

      【讨论】:

        【解决方案4】:

        在动态 sql 查询中,“FROM”和“WHERE”之间需要一个空格

        代替

        SET @RMRM =n'SELECT * FROM' + @MASTER + 'WHERE ACCT_NO =' + @ACCTNUMBER
        

        你应该这样做

        SET @RMRM = N'SELECT * FROM ' + @MASTER + N' WHERE ACCT_NO =' + @ACCTNUMBER
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-08
          相关资源
          最近更新 更多