【问题标题】:Pass query variable to a MSDB.dbo.sp_Send_DBMail将查询变量传递给 MSDB.dbo.sp_Send_DBMail
【发布时间】:2019-10-15 14:57:20
【问题描述】:

我写了一个 SQL 查询。但它给了我一个错误。

DECLARE @Delimiter Char(1)
SET @Delimiter = CHAR(9)
EXEC MSDB.dbo.sp_Send_DBMail
@profile_name = 'K2MailSetup',
@Recipients='test@xyz.com',
@Subject='Extraction Report',
@Body='Hi',
@Query='set nocount on;
Select Coalesce(replace(replace(A.[type], char(10), ''''), char(13), ''''),'''') as Type,
 try_convert(xml, col).value(''(/collection/object/fields/field/value)[1]'', ''varchar(3)'') 
from (select col= Coalesce(replace(replace(A.[business_line], char(10), ''''), char(13), ''''),'''')
    FROM [EU_OTH_REG].[dbo].[TBL_EU_OTH_TXN_REG_RSDS] A'

错误状态

消息 102,级别 15,状态 1,线路
'/' 附近的语法不正确。

【问题讨论】:

  • 我对这些单引号不好。你能帮我完成查询吗@DaleBurrell
  • 我按照你说的做了。但它仍然在我的原始查询中给我一个错误
  • Msg 22050, Level 16, State 1, Line 0 格式查询错误,可能参数无效 Msg 14661, Level 16, State 1, Procedure sp_send_dbmail, Line 517 查询执行失败:Msg 1033, Level 15,状态 1,服务器 MYKULK2DB01Q\MSSQLSTG,第 13 行 ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效,除非还指定了 TOP、OFFSET 或 FOR XML。
  • @DaleBurrell 在stackoverflow.com/q/58298194/12118671中查看我的原始查询
  • @NikhilKotian,在下面试试我的答案

标签: sql sql-server syntax-error


【解决方案1】:

我在这里发现了 2 个问题。

  1. 您的子查询未正确关闭
  2. 您的报价没有终止属性
Declare @Query as nvarchar(1000) 
Set @Query='set nocount on; 
            set QUOTED_IDENTIFIER on;
            Select try_convert(xml, Coalesce(replace(replace(A.[business_line], char(10), '''''''')
                        , char(13), ''''''''),''''''''))
                        .value(''(/collection/object/fields/field/value)[1]'', ''varchar(3)'') 
                , Coalesce(replace(replace(A.[type], char(10), ''''''''), char(13), ''''''''),'''''''') as [Type]
                from [EU_OTH_REG].[dbo].[TBL_EU_OTH_TXN_REG_RSDS] A;'

【讨论】:

    【解决方案2】:

    动态 SQL 的诀窍是在尝试使其动态化之前确保 SQL 正常工作。

    您的查询需要多次调整才能用作基本 SQL 查询:

    set nocount on;
    
    select coalesce(replace(replace(A.[type], char(10), ''''), char(13), ''''),'''') as Type
      , try_convert(xml, col).value('(/collection/object/fields/field/value)[1]', 'varchar(3)') 
    from (
        select col = coalesce(replace(replace([business_line], char(10), ''''), char(13), ''''),''''), Type
        FROM [EU_OTH_REG].[dbo].[TBL_EU_OTH_TXN_REG_RSDS]
    ) A;
    

    只有这样,通过双引号将所有单引号转换为动态 SQL:

    declare @Query as nvarchar(1000) = 'set nocount on;
    
    select coalesce(replace(replace(A.[type], char(10), ''''), char(13), ''''),'''') as Type
      , try_convert(xml, col).value(''(/collection/object/fields/field/value)[1]'', ''varchar(3)'') 
    from (
        select col = coalesce(replace(replace([business_line], char(10), ''''), char(13), ''''),''''), Type
        FROM [EU_OTH_REG].[dbo].[TBL_EU_OTH_TXN_REG_RSDS]
    ) A;'
    
    exec(@Query);
    

    【讨论】:

      猜你喜欢
      • 2015-05-19
      • 1970-01-01
      • 1970-01-01
      • 2019-02-16
      • 2016-12-19
      • 2017-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多