Sql 使用变量数据库名执行存储过程

Sql 使用变量数据库名执行存储过程,sql,tsql,stored-procedures,parameters,dynamics-gp,Sql,Tsql,Stored Procedures,Parameters,Dynamics Gp,因此,我创建了一个访问Dynamics GP供应商表的存储过程。它需要能够在不同的数据库中访问同一个表。我看到的一个可能的解决方案是只执行一个参数,并将查询写成varchar。以下是存储过程中的实际代码: Procedure [dbo].[DGP_addVendor] @dbName varchar(4) = NULL ,@NoteIndex numeric(19,5) = NULL ,@VENDORID char(15) = NULL , @VENDNAME char(65) = NULL ,

因此,我创建了一个访问Dynamics GP供应商表的存储过程。它需要能够在不同的数据库中访问同一个表。我看到的一个可能的解决方案是只执行一个参数,并将查询写成varchar。以下是存储过程中的实际代码:

Procedure [dbo].[DGP_addVendor]
@dbName varchar(4) = NULL
,@NoteIndex numeric(19,5) = NULL
,@VENDORID char(15) = NULL
, @VENDNAME char(65) = NULL
, @DEX_ROW_ID int = NULL output  
, @O_ErrorCode int = 0 output
, @ADDRESS1 char(61) = ''
, @ADDRESS2 char(61) = ''
, @ADDRESS3 char(61) = ''
, @CITY char(35) = ''
, @STATE char(29) = ''
, @ZIPCODE char(11) = ''
, @COUNTRY char(61) = ''
, @PHNUMBR1 char(21) = '' as

declare  @today datetime = convert(datetime,'01/01/1900')
declare  @defaultDate datetime = convert(datetime,'01/01/1900')
--declare @DEX int = null
Declare @sql varchar(MAX) = @dbName + '.dbo.zDP_PM00200SI
     '''+@VENDORID+'''
    ,'''+@VENDNAME+'''
    ,'''+@VENDNAME+'''
    ,'''+@VENDNAME+'''
    ,''PRIMARY''
    ,''PRIMARY''
    ,''PRIMARY''
    ,''PRIMARY''
    ,''''
    ,''''
    ,'''+@ADDRESS1+'''
    ,'''+@ADDRESS2+'''
    ,'''+@ADDRESS3+'''
    ,'''+@CITY+'''
    ,'''+@STATE+'''
    ,'''+@ZIPCODE+'''
    ,'''+@COUNTRY+'''
    ,'''+@PHNUMBR1+'''
    ,''''
    ,''''
    ,''''
    ,''''
    ,''''
    ,''''
    ,''''
    ,''''
    ,1
    ,''''
    ,''''
    ,''''
    ,0
    ,1
    ,0
    ,0
    ,''''
    ,0
    ,0
    ,0
    ,0
    ,0
    ,''''
    ,''''
    ,''''
    ,''''
    ,0
    ,''''
    ,1
    ,1
    ,1
    ,1
    ,0
    ,0
    ,1
    ,1
    ,0
    ,0
    ,0
    ,''''
    ,'+Convert(varchar,@defaultDate)+'
    ,'+Convert(varchar,@defaultDate)+'
    ,0
    ,0
    ,0
    ,0
    ,0
    ,0
    ,0
    ,0
    ,0
    ,0
    ,0
    ,0
    ,0
    ,0
    ,0
    ,0
    ,0
    ,'+Convert(varchar,@NoteIndex)+'
    ,''''
    ,'+Convert(varchar,@today)+'
    ,'+Convert(varchar,@today)+'
    ,''''
    ,1
    ,0
    ,1
    ,''''
    ,''''
    ,0
    ,0
    ,''''
    ,0
    ,0
    ,0
    ,0
    ,0
    ,0
    ,'+Convert(varchar,@defaultDate)+'
    ,0
    ,''''
    ,''''
    ,0
    ,9
    ,0
    ,''PRIMARY''
    ,' + Convert(varchar,@DEX_ROW_ID) + ' out'


        EXEC(@sql)
下面是我用来称呼它的代码:

exec [mdpSupportServices].[dbo].[DGP_addVendor] 'LFD', @index, 'ANT0000001','Anthony Quisenberry',@row out, @error out, '8506 west Rd', '','','Louisville', 'KY', '40247', 'USA',''
它似乎什么也没做。如果我走错了方向,有人能给我指出更好的方向吗

您可以创建自己的。在主数据库中创建它,使用sp_uuu前缀命名并标记为system one。因此,您可以从任何数据库调用它,SP代码将访问调用数据库的对象。这是实现业务逻辑的一种可能但不推荐的方法


另一种方法是使用动态SQL,正如您正在尝试的那样。从我的观点来看,这是一种更好的方法,但它本身就有一个优点。

因此,本版本的代码显示了调试代码。请记住,串联空值将导致空值

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[DGP_addVendor]') AND type in (N'P', N'PC'))
    DROP PROCEDURE [DGP_addVendor]
GO


CREATE PROCEDURE [dbo].[DGP_addVendor]
    @dbName VARCHAR(4) = NULL ,
    @NoteIndex NUMERIC(19, 5) = NULL ,
    @VENDORID CHAR(15) = NULL ,
    @VENDNAME CHAR(65) = NULL ,
    @DEX_ROW_ID INT = NULL OUTPUT ,
    @O_ErrorCode INT = NULL OUTPUT ,
    @ADDRESS1 CHAR(61) = '' ,
    @ADDRESS2 CHAR(61) = '' ,
    @ADDRESS3 CHAR(61) = '' ,
    @CITY CHAR(35) = '' ,
    @STATE CHAR(29) = '' ,
    @ZIPCODE CHAR(11) = '' ,
    @COUNTRY CHAR(61) = '' ,
    @PHNUMBR1 CHAR(21) = ''
AS
    DECLARE @today DATETIME ,
        @defaultDate DATETIME ,
        @sql VARCHAR(MAX)

    IF @DEX_ROW_ID IS NULL
        SET @DEX_ROW_ID = -1
    SET @today = CONVERT(DATETIME, '01/01/1900')
    SET @defaultDate = CONVERT(DATETIME, '01/01/1900')

    SET @sql = 'EXEC ' + @dbName + '.dbo.zDP_PM00200SI
     ''' + @VENDORID + '''
    ,''' + @VENDNAME + '''
    ,''' + @VENDNAME + '''
    ,''' + @VENDNAME + '''
    ,''PRIMARY''
    ,''PRIMARY''
    ,''PRIMARY''
    ,''PRIMARY''
    ,''''
    ,''''
    ,''' + @ADDRESS1 + '''
    ,''' + @ADDRESS2 + '''
    ,''' + @ADDRESS3 + '''
    ,''' + @CITY + '''
    ,''' + @STATE + '''
    ,''' + @ZIPCODE + '''
    ,''' + @COUNTRY + '''
    ,''' + @PHNUMBR1 + '''
    ,''''
    ,''''
    ,''''
    ,''''
    ,''''
    ,''''
    ,''''
    ,''''
    ,1
    ,''''
    ,''''
    ,''''
    ,0
    ,1
    ,0
    ,0
    ,''''
    ,0
    ,0
    ,0
    ,0
    ,0
    ,''''
    ,''''
    ,''''
    ,''''
    ,0
    ,''''
    ,1
    ,1
    ,1
    ,1
    ,0
    ,0
    ,1
    ,1
    ,0
    ,0
    ,0
    ,''''
    ,' + CONVERT(VARCHAR, @defaultDate) + '
    ,' + CONVERT(VARCHAR, @defaultDate) + '
    ,0
    ,0
    ,0
    ,0
    ,0
    ,0
    ,0
    ,0
    ,0
    ,0
    ,0
    ,0
    ,0
    ,0
    ,0
    ,0
    ,0
    ,' + CONVERT(VARCHAR, @NoteIndex) + '
    ,''''
    ,' + CONVERT(VARCHAR, @today) + '
    ,' + CONVERT(VARCHAR, @today) + '
    ,''''
    ,1
    ,0
    ,1
    ,''''
    ,''''
    ,0
    ,0
    ,''''
    ,0
    ,0
    ,0
    ,0
    ,0
    ,0
    ,' + CONVERT(VARCHAR, @defaultDate) + '
    ,0
    ,''''
    ,''''
    ,0
    ,9
    ,0
    ,''PRIMARY''
    ,' + CONVERT(VARCHAR, @DEX_ROW_ID) + ' OUT'


    SET @sql = '<?query -- ' + CHAR(13) + COALESCE(@sql,'') + + CHAR(13) + ' --?>'
    SELECT CONVERT(XML, @sql)

    --EXEC (@sql)  

    SELECT  @O_ErrorCode = @@ERROR

GO
DECLARE @index INT ,
    @row INT ,
    @error INT

SET @index = 1

EXEC [dbo].[DGP_addVendor] 'LFD', @index, 'ANT0000001',
    'Anthony Quisenberry', @row OUT, @error OUT, '8506 west Rd', '', '',
    'Louisville', 'KY', '40247', 'USA', ''

SELECT  @row AS [@row], @error AS [@error]

打印SQL语句,复制结果,然后尝试手动执行,以查看是否存在无法预见的问题。\n如果zDP_PM00200SI没有生成任何输出,则除了“查询已成功完成”消息外,您将看不到任何其他内容。如果它确实生成了输出,而您却看不到,请按照Jeremy所说的操作和/或打开您的探查器并跟踪执行的查询NULL@QRiz-确保不向动态查询中使用的参数传递NULL值。如果任何变量为NULL,则整个varchar将为NULL。任何字符串加上null都会产生null。使用IsNull@myVariable,以消除这种情况。