【问题标题】:OUTPUT variables to sp_executesql输出变量到 sp_executesql
【发布时间】:2018-02-01 00:57:19
【问题描述】:

背景:SQL Server 2008 R2

遇到以下问题。获得了“完成”的usp,作者不可用。它从源表中提取数据,复制到归档数据库中同名+日期时间戳的目标表,然后截断源表。在截断源之前,想确认没有发生错误并且行数相同。当我使用 DDL 时,TRY CATCH 组合不起作用。

以下代码有效:

DECLARE @HostName           VARCHAR(30)     -- Name of server running script
DECLARE @dbName             VARCHAR(30)     -- Database currently connected to
DECLARE @LogText            VARCHAR(255)            -- Text to be logged to ArchLog table
DECLARE @NewUTMetaData          VARCHAR(255)        -- New tablename for UTMetaData
DECLARE @NewOutboundMessagePending  VARCHAR(255)        -- New tablename for OutboundMessagePending
DECLARE @NewOutboundMessageStatus   VARCHAR(255)        -- New tablename for OutboundMessageStatus
DECLARE @NewOutboundMessageResult   VARCHAR(255)        -- New tablename for OutboundMessageResult
DECLARE @NewFileMessageNonSequence  VARCHAR(255)        -- New tablename for FileMessageNonSequence
DECLARE @NewOutboundMessageRequest  VARCHAR(255)        -- New tablename for OutboundMessageRequest
DECLARE @NewOutboundMessage         VARCHAR(255)        -- New tablename for OutboundMessage
DECLARE @SQLQuery                   NVARCHAR(500)
DECLARE @return_value               INT
DECLARE @Err                        INT = 0
DECLARE @ErrFin                     INT = 0
DECLARE @SQLCount                   NVARCHAR(255) = 'SELECT @TargetCountOUT = COUNT(*) FROM ' 
DECLARE @ParmDefinition             nvarchar(50)  = N'@TargetCountOUT int OUTPUT';;
DECLARE @SourceCount                INT = 0
DECLARE @TargetCount                INT = 0

--  Log message that delete is starting
SELECT  @HostName = host_name()
SELECT  @dbName   = db_name()
SELECT  @LogText  = 'Procedure ArchiveMuleDBMetrix_NEW starting database= ' + @dbname + ' host= ' + @HostName 
EXEC xp_logevent 50001, @LogText, 'INFORMATIONAL'

INSERT INTO [MuleDBArch].[dbo].[ArchLog]
       ([LogEntryDateTime]
       ,[LogEntry])
    VALUES (GETDATE()
    ,@LogText)

BEGIN
    SELECT @NewUTMetaData             = (SELECT '[MuleDBArch].[dbo].UTMetaDataA'             + convert(varchar(50),GetDate(),112) + replace(convert(varchar, GetDate(),108),':',''))
    SET @err = @@error;
    SET @SQLQuery = 'select * into ' + @NewUTMetaData             + ' from [MuleDB].[dbo].[SASITUTMetaData]'
    EXECUTE sp_executesql @SQLQuery
    SET @SourceCount = @@ROWCOUNT

    SELECT  @LogText = 'Rows archived into ' + @NewUTMetaData + ' by Procedure ArchiveMuleDBMetrix_NEW = ' + CAST(@SourceCount as VARCHAR(6))
    EXEC xp_logevent 50002, @LogText, 'INFORMATIONAL'
    INSERT INTO [MuleDBArch].[dbo].[ArchLog]
      ([LogEntryDateTime]
      ,[LogEntry])
    VALUES (GETDATE()
           ,@LogText)

    IF @err = 0
      BEGIN
        SET @sqlcount = @sqlcount + @NewUTMetaData
        EXECUTE sp_executesql @sqlcount, @ParmDefinition, @TargetCountOUT=@TargetCount OUTPUT;
        IF @SourceCount = @TargetCount
          TRUNCATE TABLE [MuleDB].[dbo].[SASITUTMetaData]
        ELSE
          SELECT  @LogText = 'Post archive, row counts differ between [MuleDB].[dbo].[SASITUTMetaData] and' + @NewUTMetaData 
          EXEC xp_logevent 50003, @LogText, 'Error'
          Set @errfin = 1
          SET @err = 0
      END    
    ELSE
      BEGIN
        SELECT  @LogText = 'Procedure ArchiveMuleDBMetrix_NEW failed archiving into ' + @NewUTMetaData 
        EXEC xp_logevent 50004, @LogText, 'Error'
        Set @errfin = 1
        SET @err = 0
      END
END

但是,如果我重复该块以在另一个表(或实际上是同一个表)上工作,则查询完成并出现错误并且我收到消息:

消息 102,第 15 级,状态 1,第 1 行
'.' 附近的语法不正确。

我想我已经把范围缩小到了:

EXECUTE sp_executesql @sqlcount, @ParmDefinition, @TargetCountOUT=@TargetCount OUTPUT;

任何帮助表示赞赏

【问题讨论】:

    标签: stored-procedures sql-server-2008-r2 sp-executesql


    【解决方案1】:

    在下面的代码中

    执行 sp_executesql @sqlcount、@ParmDefinition、@TargetCountOUT=@TargetCount 输出;

    在调用存储过程时,您试图传递参数值而不指定参数名称,但输出参数除外。为 all 或 none 指定参数名称。尝试执行如下代码

    执行 sp_executesql @sqlcount、@ParmDefinition、@TargetCount 输出;

    【讨论】:

      猜你喜欢
      • 2015-11-24
      • 2017-10-28
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多