【问题标题】:SQL Server 2017 - Database mail stored procedureSQL Server 2017 - 数据库邮件存储过程
【发布时间】:2019-04-23 09:50:01
【问题描述】:

我有一个存储过程,基本上我想做以下事情:

  1. 创建临时表(如果不存在)并填充数据
  2. 将查询输出到 SSMS,并为查询分配一个变量 (@sql)
  3. 使用查询,将查询内容通过电子邮件发送给收件人

我的脚本是这样的:

Create Procedure ListDaysofYear(@year as integer)
as 
    Declare @sql as varchar(200), @DBqry as varchar(200),
            @tab as char(1) = char(9)
    Declare @dayofyear as bigint = 1
    Declare @monthofyear as int = 1
    Declare @day as int = 1
    Declare @curDate as datetime
    Declare @DB as varchar(40)
    Declare @sql2 as varchar(40)

    Set @curDate = datefromparts(@year, @monthofyear, @day)
    Set @DB = 'msdb'

    IF OBJECT_ID('tempdb.dbo.##daysofYear','U') IS NOT NULL
        DROP TABLE ##daysofYear
        --Print 'YES'
    ELSE
        CREATE TABLE ##daysofYear
        (
             cDate DATETIME PRIMARY KEY NOT NULL,
             cMonth VARCHAR(20) NOT NULL,
             cDay VARCHAR(20) NOT NULL
        )

    WHILE year(@curDate) = @year
    BEGIN
        -- Insert rows based on each day of the year
        INSERT INTO ##daysofYear (cDate, cMonth, cDay)
        VALUES( (@curDate),
                (DATENAME([MONTH], @curDate)),
                (DATENAME([WEEKDAY], @curDate)) )

        SET @curDate = @curDate + 1
    END 

    --Output file to SSMS query window
    Select dy.* from ##daysofYear dy;

    Set @sql = 'Select dy.* from ##daysofYear dy;'
    Set @sql2 = 'Use ' + @DB + '; Exec msdb.dbo.sp_send_dbmail
             @profile_name = ''Notifications'',
             @recipients = ''mikemirabelli6@hotmail.com'',
             @attach_query_result_as_file = 1,
             @query_attachment_filename = ''daysofyear.txt'',
             @query_result_separator = '',
             @body = ''The attached output file - DaysofYear table'',
             @query = ''Select dy.* from ##daysofYear dy'' ;'

    --Execute sp_sqlexec @sql
    Exec(@sql2)

基本上当我运行执行行时:

Exec dbo.ListDaysofYear 2018 ;

我第一次收到以下消息:

消息 208,级别 16,状态 0,过程 dbo.ListDaysofYear,第 25 行
[批处理开始第 52 行] 无效的对象名称 '##daysofYear

我相信它与 T-SQL 的“DROP TABLE”部分有关。

谢谢

【问题讨论】:

  • 我注意到,当我尝试在发送邮件 SP 的 @query 参数中编写任何简单的东西时,我收到了这条消息,否则第二个错误永远不会触发。每当我写一个简单的选择(Ex Select 1)时,总是会返回此消息。
  • 我不认为可以通过动态 SQL 访问临时表。你能不使用真正的桌子并在最后清理它们吗?
  • 我想到了这一点,但是当我尝试使用常规表时,结果相同 - IF 未按预期在查询中触发。当我执行以下操作时很奇怪:'IF OBJECT_ID('tempdb.dbo.##daysofYear','U') IS NOT NULL Print 'Exists' ELSE Print 'Does Not Exist' IF OBJECT_ID('tempdb.dbo.## daysofYear','U') IS NOT NULL Drop Table ##daysofYear ELSE Create Table ##daysofYear (id# int primary key); ' 然后我来回走动,它按预期工作。
  • NVM,我想我找到了问题,IF OBJECT_ID('tempdb.dbo.##daysofYear','U') IS NOT NULL
  • 如果在 if 和 else 下添加 BEGIN 和 END,则可以有多个语句。 BEGIN 和 END 之间可以有多行代码

标签: sql-server-2017 sp-send-dbmail drop-table ssms-2017


【解决方案1】:

我认为我找到了问题:

IF OBJECT_ID('tempdb.dbo.##daysofYear','U') IS NOT NULL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 2011-01-10
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    相关资源
    最近更新 更多