【问题标题】:How to show PRINT results in EXCEL如何在 EXCEL 中显示 PRINT 结果
【发布时间】:2016-07-08 01:20:08
【问题描述】:

由于问题,我和一个团队成员重新编写了我们在此处发布的查询;使用我之前问题提供的答案中的各种来源以及检查其他解决方案,查询现在按预期工作。 但是我们需要嵌入这个查询并在后台运行(我们已经有)到 EXCEL 工作表中,但问题是我们需要以某种方式在单元格中实际显示结果。查询的 PRINT 函数实际上在我们运行时会在 EXCEL 中弹出一个窗口(DUH,如预期的那样),但我们想做的是如何显示 PRINTED 结果.由于查询是在电子表格中自动运行的,因此从 SSMS 导出到文件然后从那里检索的选项不是一个选项,因为我们的 DBA 对我们无法作为作业运行的数据库的处理非常时髦。等等。 .. 任何帮助将不胜感激。

Declare @StartDate1 as DateTime
Declare @StartDate2 as DateTime
Declare @EndDate1 as DateTime
Declare @EndDate2 as DateTime
Declare @TodaysDate1 as DateTime
Declare @TodaysDate2 as DateTime
Declare @Yesterday as DateTime

Declare @TotalRecords1 int = 7
Declare @TotalRecords2 int = 7

set @TodaysDate1 = GETDATE()
set @TodaysDate2 = @TodaysDate1
set @Yesterday = DATEADD(day,-1,@TodaysDate1)

-------------------------------------------------------------------
--                For AM Shift Data Readings                     --
-------------------------------------------------------------------
set @StartDate1 = cast(convert(varchar(4), datepart(yyyy, @Yesterday)) + '-' +
    convert(varchar(2), datepart(mm, @Yesterday)) + '-' +
    convert(varchar(2), datepart(dd, @Yesterday)) + ' ' +
    '17:00' as datetime)
set @EndDate1 = cast(convert(varchar(4), datepart(yyyy, @TodaysDate1)) + '-' +
    convert(varchar(2), datepart(mm, getdate())) + '-' +
    convert(varchar(2), datepart(dd, getdate())) + ' ' +
    '04:59' as datetime)

-------------------------------------------------------------------
--                For PM Shift Data Readings                     --
-------------------------------------------------------------------
set @StartDate2 = cast(convert(varchar(4), datepart(yyyy, @Yesterday)) + '-' +
    convert(varchar(2), datepart(mm, @Yesterday)) + '-' +
    convert(varchar(2), datepart(dd, @Yesterday)) + ' ' +
    '05:00' as datetime)
set @EndDate2 = cast(convert(varchar(4), datepart(yyyy, @Yesterday)) + '-' +
    convert(varchar(2), datepart(mm, @Yesterday)) + '-' +
    convert(varchar(2), datepart(dd, @Yesterday)) + ' ' +
    '16:59' as datetime)

--------Material Scan Table--------

SELECT
@TotalRecords1=(SELECT Count(*) FROM [Piston_TOL_PROD_DB].[dbo].[tblLOT_CTRL_Active_Component] WHERE Close_Time_Stamp between @StartDate1 and @EndDate1), 
@TotalRecords2=(SELECT Count(*) FROM [Piston_TOL_PROD_DB].[dbo].[tblLOT_CTRL_Active_Component] WHERE Close_Time_Stamp between @StartDate2 and @EndDate2) 

WHILE @TotalRecords1 = 0 AND @TotalRecords2 = 0

BEGIN
set @TodaysDate1 = DATEADD(day,-1,@TodaysDate1)
set @TodaysDate2 = DATEADD(day,-1,@TodaysDate2)
set @Yesterday = DATEADD(day,-1,@TodaysDate1)

-------------------------------------------------------------------
--                For AM Shift Data Readings                     --
-------------------------------------------------------------------
set @StartDate1 = cast(convert(varchar(4), datepart(yyyy, @Yesterday)) + '-' +
    convert(varchar(2), datepart(mm, @Yesterday)) + '-' +
    convert(varchar(2), datepart(dd, @Yesterday)) + ' ' +
    '17:00' as datetime)
set @EndDate1 = cast(convert(varchar(4), datepart(yyyy, @TodaysDate1)) + '-' +
    convert(varchar(2), datepart(mm, getdate())) + '-' +
    convert(varchar(2), datepart(dd, getdate())) + ' ' +
    '04:59' as datetime)

-------------------------------------------------------------------
--                For PM Shift Data Readings                     --
-------------------------------------------------------------------
set @StartDate2 = cast(convert(varchar(4), datepart(yyyy, @TodaysDate2)) + '-' +
    convert(varchar(2), datepart(mm, getdate())) + '-' +
    convert(varchar(2), datepart(dd, getdate())) + ' ' +
    '05:00' as datetime)
set @EndDate2 = cast(convert(varchar(4), datepart(yyyy, @TodaysDate2)) + '-' +
    convert(varchar(2), datepart(mm, getdate())) + '-' +
    convert(varchar(2), datepart(dd, getdate())) + ' ' +
    '16:59' as datetime)

SELECT
@TotalRecords1=(SELECT Count(*) FROM [Piston_TOL_PROD_DB].[dbo].[tblLOT_CTRL_Active_Component] WHERE Close_Time_Stamp between @StartDate1 and @EndDate1), 
@TotalRecords2=(SELECT Count(*) FROM [Piston_TOL_PROD_DB].[dbo].[tblLOT_CTRL_Active_Component] WHERE Close_Time_Stamp between @StartDate2 and @EndDate2)

IF (SELECT Count(*) FROM [Piston_TOL_PROD_DB].[dbo].[tblLOT_CTRL_Active_Component] WHERE Close_Time_Stamp between @StartDate1 and @EndDate1) > 0
    BREAK
ELSE 
    IF (SELECT Count(*) FROM [Piston_TOL_PROD_DB].[dbo].[tblLOT_CTRL_Active_Component] WHERE Close_Time_Stamp between @StartDate2 and @EndDate2) > 0
    BREAK
    ELSE
    CONTINUE
END

PRINT '1st Shift LOT Trace Scans ending'
PRINT @EndDate2
PRINT @TotalRecords2
PRINT ' ' 
PRINT '2nd Shift LOT Trace Scans ending'
PRINT @EndDate1
PRINT @TotalRecords1

这些是在 SSMS 中运行查询的实际结果,我们希望以某种方式让 EXCEL 显示:

1st Shift LOT Trace Scans ending
Jul  6 2016  4:59PM
64

2nd Shift LOT Trace Scans ending
Jul  7 2016  4:59AM
73

【问题讨论】:

    标签: sql sql-server excel ssms


    【解决方案1】:

    您可以尝试将它们保存到表变量中,而不是按如下方式打印它们:

    declare @msgTable table ( msg varchar(100));
    insert into @msgTable values ('1st Shift LOT Trace Scans ending');
    insert into @msgTable values (@EndDate2);
    select * from @msgTable;
    

    然后右键单击结果并单击Save results ascsv 文件或tab delimited 文件,这两个文件都可以在excel 中打开。

    【讨论】:

    • 谢谢,我的班次即将结束,所以我会转发给团队尝试。
    • 因为我无法入睡,所以我按照您的建议做了,并且在查询中效果很好。解决一个填充到 EXCEL 的小问题,因为我们希望此查询自动填充,但这是一个很好的响应,并且更接近我们的最终结果!。非常感谢您的回复。
    • 1st Shift LOT Trace Scans ending Jul 8 2016 4:59AM 93
    【解决方案2】:

    因此,经过一个长周末和团队的帮助,我们能够在 EXCEL 中获得我们想要的结果,而且非常简单。我们需要做的不是 PRINT,而是使用 CONCAT。我想既然我们最终得出了一个结论,我会在这里发布。虽然上面的答案也是一种解决方案,但我在这里发布的答案更符合我们的喜好,以避免在我们可以通过查询自动导入时导出数据。感谢所有参与进来的人!见下文:

    SELECT CONCAT ( '1st Shift  ', @StartDate1, ' Total Scans ', @TotalRecords1, ' and ' +
    '2nd Shift ', @StartDate2, ' Total Scans ', @TotalRecords2 ) as LotTrace
    

    结果是:

    LotTrace
    1st Shift  Jul 11 2016  5:00PM Total Scans 105                      2nd Shift Jul 11 2016  5:00AM Total Scans 77
    

    【讨论】:

    • 您的结果甚至与您问题中的预期结果不匹配。 CONCAT 所做的只是将字符串附加在一起。您可以PRINTSELECT 结果字符串。
    • 我最初的问题是我们无法将查询结果作为一行获得,因此我们可以从 EXCEL 工作表中运行,那么我们该怎么做。从 EXCEL 中执行时,PRINT 结果不起作用。为了获得这些结果,我们最终使用 CONCAT 将其显示为 DB 和 EXCEL 中名为 LotTrace 的行结果,这样我们就可以在自动运行的电子表格中的进一步计算中使用结果数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 2021-04-11
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    相关资源
    最近更新 更多