2017-04-25 3 views
0

Ich versuche, einen Parameterwert in einer gespeicherten Prozedur zu verwenden. Aber aus irgendeinem Grund erhalte ich einen FehlerSQL Server Verwenden Sie Parameter in gespeicherten Prozeduren

falsche Syntax nahe @sourceDB

Der Code ich schreibe ist

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 

Aber wenn ich den Wert harter Code für Database_Name es funktioniert fein. Zum Beispiel

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 

Kann mir jemand sagen, was ich falsch mache?

Ich verwende SQL Server 2016 Management Studio. Die Datenbank befindet sich auf einem Azure-Server.

+0

Ziemlich sicher, dass Sie dynamische sql dafür verwenden müssten. –

+1

Die meisten DDLs können nicht parametrisiert werden. Einschließlich dieses. –

+1

Ich würde fragen, warum Sie eine externe Datenquelle in einer gespeicherten Prozedur an erster Stelle erstellen möchten. Dies wird beim zweiten Mal fehlschlagen, wenn Sie die Datenquelle löschen. –

Antwort

0

Ich bin mit Sean auf diesem, aber eine Möglichkeit, die ich denke, würde funktionieren, ist es in logische Abschnitte zu zerlegen, wenn Sie nicht viele Datenbanken haben. Es macht jedoch keinen Sinn, das immer wieder neu zu erstellen und zu löschen. Erstellen Sie es einfach und lassen Sie es dort, wenn Sie es brauchen.

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 
+0

@SeanLange Ich denke, ich verwende nicht den Code, sondern dynamische Sql, da ich viele Datenbanken habe. Trotzdem danke – sohil

Verwandte Themen