【问题标题】:SQL Server Use parameters in stored proceduresSQL Server 在存储过程中使用参数
【发布时间】:2017-04-25 19:01:04
【问题描述】:

我正在尝试在存储过程中使用参数值。但由于某种原因,我收到了一个错误

@sourceDB 附近的语法不正确

我写的代码是

CREATE PROCEDURE [dbo].[copyRecordType]
     (@loggedInUserID varchar(max), 
      @recordTypeID int, 
      @sourceDB varchar(max))
AS
BEGIN
    CREATE EXTERNAL DATA SOURCE RemoteReferenceData
    WITH
    (
        TYPE=RDBMS,
        LOCATION=servername,--server name is not the issue
        DATABASE_NAME= @sourceDB,
        CREDENTIAL= AppCred--credential is also not the issue
    );
END

但是,如果我对Database_Name 的值进行硬编码,它就可以正常工作。例如

CREATE PROCEDURE [dbo].[copyRecordType]
    (@loggedInUserID varchar(max), 
     @recordTypeID int, 
     @sourceDB varchar(max))
AS
BEGIN
    CREATE EXTERNAL DATA SOURCE RemoteReferenceData
    WITH
    (
        TYPE=RDBMS,
        LOCATION=servername,
        DATABASE_NAME= 'test',
        CREDENTIAL= AppCred
    );
END

有人可以指导我做错了什么吗?

我正在使用 SQL Server 2016 Management Studio。数据库位于 Azure 服务器上。

【问题讨论】:

  • 很确定您必须为此使用动态 sql。
  • 大多数 DDL 无法参数化。包括这个。
  • 我想问你为什么要首先在存储过程中创建一个外部数据源。这将在第二次执行时失败,除非您还删除了数据源。
  • @SeanLange 是查询另一个数据库中的表。我最终将删除数据源
  • 我了解它的用途。但是为什么不简单地在您的程序之外创建外部数据源呢?否则,您要么必须编写一堆代码来检查它是否存在,要么必须不断删除并重新创建它。好像有点傻只需创建外部数据源并不管它。需要时参考。

标签: sql-server stored-procedures parameters


【解决方案1】:

我和 Sean 一起讨论这个问题,但如果您没有很多数据库,我认为可行的一种方法是将其分解为逻辑部分。但是,一遍又一遍地创建和删除它是没有意义的。只需创建它,并在需要时将其留在那里。

CREATE PROCEDURE [dbo].[copyRecordType](@loggedInUserID varchar(max), @recordTypeID int, @sourceDB  varchar(max))
AS
BEGIN

    IF(@sourceDB = 'db_1') 
    BEGIN
        CREATE EXTERNAL DATA SOURCE RemoteReferenceData
        WITH
        (
            TYPE=RDBMS,
            LOCATION=servername,--server name is not the issue
            DATABASE_NAME= db_1,
            CREDENTIAL= AppCred --credential is also not the issue
        );
    END
    IF(@sourceDB = 'db_2')
        BEGIN
        ...
        END
END

【讨论】:

  • @SeanLange 我认为不适合使用动态 sql 而不是代码,因为我有很多数据库。还是谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多