Sql server SQL Server在存储过程中使用参数

Sql server SQL Server在存储过程中使用参数,sql-server,stored-procedures,parameters,Sql Server,Stored Procedures,Parameters,我试图在存储过程中使用参数值。但由于某种原因,我得到了一个错误 @sourceDB附近的语法不正确 我写的代码是 CREATE PROCEDURE [dbo].[copyRecordType] (@loggedInUserID varchar(max), @recordTypeID int, @sourceDB varchar(max)) AS BEGIN CREATE EXTERNAL DATA SOURCE RemoteReferenceData

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

@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
但是如果我硬编码
数据库\u 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管理工作室。数据库位于Azure服务器上。

我同意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

可以肯定的是,您必须为此使用动态sql。大多数DDL都不能参数化。包括这一点。我想问一下,首先为什么要在存储过程中创建外部数据源。除非同时删除数据源,否则它将在第二次执行时失败。@SeanLange在另一个数据库中查询表。我将删除数据源,最终我会明白它的用途。但是为什么不在您的过程之外简单地创建外部数据源呢?否则,您要么编写一堆代码来检查它是否存在,要么必须不断删除并重新创建它。看起来有点傻。只需创建外部数据源,就可以了。需要时可以引用它。@SeanLange我想我会使用动态sql而不是代码,因为我有很多数据库。谢谢你