【问题标题】:Print output of a dynamic query?打印动态查询的输出?
【发布时间】:2021-03-02 23:09:58
【问题描述】:

我可以通过以下方式获得在我的存储过程中使用的表的输出:-

DECLARE @xmltmp xml = (SELECT * FROM table FOR XML AUTO)
PRINT CONVERT(NVARCHAR(MAX), @xmltmp)

现在,我遇到了一个使用动态查询的 sp。

SELECT @query = 'SELECT * FROM ' + @TempTableVariable;
EXECUTE sp_executesql @query

我想对查询进行类似的输出打印(如上面的 xml 打印)。

我环顾四周,发现只有一个变量输出

Getting result of dynamic SQL into a variable for sql-server

Dynamic SQL output of a query to a variable

【问题讨论】:

  • 我不明白你在这里问什么。 @TempTableVariable 是什么?变量不是临时对象,临时对象也不是变量。如果是表类型变量,上面会报错,如果是标量变量,上面看起来就容易受到注入攻击。
  • 如果你想从你的 sp_executesql 输出到一个临时表/临时表,你可以这样做,查找 SP 执行结果插入到表中。
  • @Larnu 它是一个 nvarchar DECLARE @TempTableVariable nvarchar(300) = '[##TempTable_'+ convert(nvarchar(200),newid()) + ']'
  • SQL 并非旨在生成“漂亮”的输出。当您检查结果集时,您看到的是任何应用程序正在使用该结果集并生成输出以供视觉使用的函数。使用适合您目标的工具 - 甚至可能是 MS Office 工具。

标签: sql sql-server tsql


【解决方案1】:

我认为这主要是关于格式化数据以使其看起来更像表格的问题,因为您可以按照问题中的指示获取表格数据。我使用了一个具有以下结构和数据的示例表:

create table Sample
(   Column1 date
,   Column2 char(3)
,   Column3 decimal(5, 2)
,   Column4 varchar(5)
)

insert
    dbo.Sample
(   Column1
,   Column2
,   Column3
,   Column4
)
values
  ('2020-09-28', 'AC1', 7.5, 'Mon')
, ('2021-02-15', 'AC2', 7.5, 'Wed')
, ('2021-02-16', 'AC2', 7.5, 'Thurs')
, ('2021-02-10', 'AC3', 7.5, 'Mon')
, ('2021-02-12', 'AC4', 3.5, 'Tue')
, ('2021-02-08', 'AC4', 1,   'Mon')
, ('2021-02-10', 'AD4', 7.5, 'Wed')
, ('2021-02-11', 'AD4', 7.5, 'Thurs')
, ('2021-02-15', 'AD4', 7.5, 'Mon')
, ('2021-02-16', 'AD4', 7.5, 'Tue')
, ('2021-02-17', 'AD4', 7.5, 'Wed')
, ('2021-02-18', 'AD4', 7.5, 'Thurs')
, ('2021-02-22', 'AC4', 7.5, 'Mon')

一种方法可能是这样的:

declare @tablerows varchar(max) = ''

select
    @tablerows = @tablerows + '''' + convert(varchar, s.Column1) + ''', ''' + s.Column2 + ''', ' + convert(varchar, s.Column3) + ', ''' + s.Column4 + '''
'
from
    dbo.Sample s


print @tablerows

给出结果:

'2020-09-28', 'AC1', 7.50, 'Mon'
'2021-02-15', 'AC2', 7.50, 'Wed'
'2021-02-16', 'AC2', 7.50, 'Thurs'
'2021-02-10', 'AC3', 7.50, 'Mon'
'2021-02-12', 'AC4', 3.50, 'Tue'
'2021-02-08', 'AC4', 1.00, 'Mon'
'2021-02-10', 'AD4', 7.50, 'Wed'
'2021-02-11', 'AD4', 7.50, 'Thurs'
'2021-02-15', 'AD4', 7.50, 'Mon'
'2021-02-16', 'AD4', 7.50, 'Tue'
'2021-02-17', 'AD4', 7.50, 'Wed'
'2021-02-18', 'AD4', 7.50, 'Thurs'
'2021-02-22', 'AC4', 7.50, 'Mon'

另一种方法可能是这样的:

declare @tablerows varchar(max) = convert(varchar(max), (SELECT * FROM dbo.Sample rows FOR XML AUTO))

set @tablerows = replace(@tablerows, '/><rows', '
')
set @tablerows = replace(@tablerows, '<rows', '')
set @tablerows = replace(@tablerows, '/>', '')

print @tablerows

结果如下:

 Column1="2020-09-28" Column2="AC1" Column3="7.50" Column4="Mon"
 Column1="2021-02-15" Column2="AC2" Column3="7.50" Column4="Wed"
 Column1="2021-02-16" Column2="AC2" Column3="7.50" Column4="Thurs"
 Column1="2021-02-10" Column2="AC3" Column3="7.50" Column4="Mon"
 Column1="2021-02-12" Column2="AC4" Column3="3.50" Column4="Tue"
 Column1="2021-02-08" Column2="AC4" Column3="1.00" Column4="Mon"
 Column1="2021-02-10" Column2="AD4" Column3="7.50" Column4="Wed"
 Column1="2021-02-11" Column2="AD4" Column3="7.50" Column4="Thurs"
 Column1="2021-02-15" Column2="AD4" Column3="7.50" Column4="Mon"
 Column1="2021-02-16" Column2="AD4" Column3="7.50" Column4="Tue"
 Column1="2021-02-17" Column2="AD4" Column3="7.50" Column4="Wed"
 Column1="2021-02-18" Column2="AD4" Column3="7.50" Column4="Thurs"
 Column1="2021-02-22" Column2="AC4" Column3="7.50" Column4="Mon"

当然,这两种方法都与从表格中选择并输出到文本完全一样,但是您可以根据您对格式的关心程度,从这两种方法中的任何一种中进行构建。

【讨论】:

    猜你喜欢
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多