回答
你知道,有可能是一个更简单的方法,但弹出想到的第一件事是:
Declare @SumVal int;
Select @SumVal=Sum(Amount) From Expense;
Print @SumVal;
你可以,当然,打印任何以这种方式从表中的字段数量。当然,如果要打印返回多行的查询的所有结果,则只需将输出适当地引导(例如,输入到文本)。
这通常是最好的方法,但是当您有大量要使用'print'转储出来的行和列时,请参阅下面的@DanFields答案以获得一个很好的解决方案 - http://stackoverflow.com/a/36729681/8479 – Rory 2016-04-24 20:02:13
set @n = (select sum(Amount) from Expense)
print 'n=' + @n
如果要打印多行,可以使用游标遍历结果。 例如从sys.database_principals
DECLARE @name nvarchar(128)
DECLARE cur CURSOR FOR
SELECT name FROM sys.database_principals
OPEN cur
FETCH NEXT FROM cur INTO @name;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @name
FETCH NEXT FROM cur INTO @name;
END
CLOSE cur;
DEALLOCATE cur;
我写你想要的东西,这个SP做打印所有的名字,但是,你需要使用动态SQL。
这为我工作的SQL Server 2008 R2上
ALTER procedure [dbo].[PrintSQLResults]
@query nvarchar(MAX),
@numberToDisplay int = 10,
@padding int = 20
as
SET NOCOUNT ON;
SET ANSI_WARNINGS ON;
declare @cols nvarchar(MAX),
@displayCols nvarchar(MAX),
@sql nvarchar(MAX),
@printableResults nvarchar(MAX),
@NewLineChar AS char(2) = char(13) + char(10),
@Tab AS char(9) = char(9);
if exists (select * from tempdb.sys.tables where name = '##PrintSQLResultsTempTable') drop table ##PrintSQLResultsTempTable
set @query = REPLACE(@query, 'from', ' into ##PrintSQLResultsTempTable from');
--print @query
exec(@query);
select ROW_NUMBER() OVER (ORDER BY (select Null)) AS ID12345XYZ, * into #PrintSQLResultsTempTable
from ##PrintSQLResultsTempTable
drop table ##PrintSQLResultsTempTable
select name
into #PrintSQLResultsTempTableColumns
from tempdb.sys.columns where object_id =
object_id('tempdb..#PrintSQLResultsTempTable');
select @cols =
stuff((
(select ' + space(1) + (LEFT((CAST([' + name + '] as nvarchar(max)) + space('+ CAST(@padding as nvarchar(4)) +')), '+CAST(@padding as nvarchar(4))+')) ' as [text()]
FROM #PrintSQLResultsTempTableColumns
where name != 'ID12345XYZ'
FOR XML PATH(''), root('str'), type).value('/str[1]','nvarchar(max)'))
,1,0,'''''');
select @displayCols =
stuff((
(select space(1) + LEFT(name + space(@padding), @padding) as [text()]
FROM #PrintSQLResultsTempTableColumns
where name != 'ID12345XYZ'
FOR XML PATH(''), root('str'), type).value('/str[1]','nvarchar(max)'))
,1,0,'');
DECLARE
@tableCount int = (select count(*) from #PrintSQLResultsTempTable);
DECLARE
@i int = 1,
@ii int = case when @tableCount < @numberToDisplay then @tableCount else @numberToDisplay end;
print @displayCols -- header
While @i <= @ii
BEGIN
set @sql = N'select @printableResults = ' + @cols + ' + @NewLineChar from #PrintSQLResultsTempTable where ID12345XYZ = ' + CAST(@i as varchar(3)) + '; print @printableResults;'
--print @sql
execute sp_executesql @sql, N'@NewLineChar char(2), @printableResults nvarchar(max) output', @NewLineChar = @NewLineChar, @printableResults = @printableResults output
print @printableResults
SET @i += 1;
END
这为我工作的SQL Server 2012
ALTER procedure [dbo].[PrintSQLResults]
@query nvarchar(MAX),
@numberToDisplay int = 10,
@padding int = 20
as
SET NOCOUNT ON;
SET ANSI_WARNINGS ON;
declare @cols nvarchar(MAX),
@displayCols nvarchar(MAX),
@sql nvarchar(MAX),
@printableResults nvarchar(MAX),
@NewLineChar AS char(2) = char(13) + char(10),
@Tab AS char(9) = char(9);
if exists (select * from tempdb.sys.tables where name = '##PrintSQLResultsTempTable') drop table ##PrintSQLResultsTempTable
set @query = REPLACE(@query, 'from', ' into ##PrintSQLResultsTempTable from');
--print @query
exec(@query);
select ROW_NUMBER() OVER (ORDER BY (select Null)) AS ID12345XYZ, * into #PrintSQLResultsTempTable
from ##PrintSQLResultsTempTable
drop table ##PrintSQLResultsTempTable
select name
into #PrintSQLResultsTempTableColumns
from tempdb.sys.columns where object_id =
object_id('tempdb..#PrintSQLResultsTempTable');
select @cols =
stuff((
(select ' + space(1) + LEFT(CAST([' + name + '] as nvarchar('+CAST(@padding as nvarchar(4))+')) + space('+ CAST(@padding as nvarchar(4)) +'), '+CAST(@padding as nvarchar(4))+') ' as [text()]
FROM #PrintSQLResultsTempTableColumns
where name != 'ID12345XYZ'
FOR XML PATH(''), root('str'), type).value('/str[1]','nvarchar(max)'))
,1,0,'''''');
select @displayCols =
stuff((
(select space(1) + LEFT(name + space(@padding), @padding) as [text()]
FROM #PrintSQLResultsTempTableColumns
where name != 'ID12345XYZ'
FOR XML PATH(''), root('str'), type).value('/str[1]','nvarchar(max)'))
,1,0,'');
DECLARE
@tableCount int = (select count(*) from #PrintSQLResultsTempTable);
DECLARE
@i int = 1,
@ii int = case when @tableCount < @numberToDisplay then @tableCount else @numberToDisplay end;
print @displayCols -- header
While @i <= @ii
BEGIN
set @sql = N'select @printableResults = ' + @cols + ' + @NewLineChar from #PrintSQLResultsTempTable where ID12345XYZ = ' + CAST(@i as varchar(3)) + ' '
--print @sql
execute sp_executesql @sql, N'@NewLineChar char(2), @printableResults nvarchar(max) output', @NewLineChar = @NewLineChar, @printableResults = @printableResults output
print @printableResults
SET @i += 1;
END
这为我工作的SQL Server 2014年
ALTER procedure [dbo].[PrintSQLResults]
@query nvarchar(MAX),
@numberToDisplay int = 10,
@padding int = 20
as
SET NOCOUNT ON;
SET ANSI_WARNINGS ON;
declare @cols nvarchar(MAX),
@displayCols nvarchar(MAX),
@sql nvarchar(MAX),
@printableResults nvarchar(MAX),
@NewLineChar AS char(2) = char(13) + char(10),
@Tab AS char(9) = char(9);
if exists (select * from tempdb.sys.tables where name = '##PrintSQLResultsTempTable') drop table ##PrintSQLResultsTempTable
set @query = REPLACE(@query, 'from', ' into ##PrintSQLResultsTempTable from');
--print @query
exec(@query);
select ROW_NUMBER() OVER (ORDER BY (select Null)) AS ID12345XYZ, * into #PrintSQLResultsTempTable
from ##PrintSQLResultsTempTable
drop table ##PrintSQLResultsTempTable
select name
into #PrintSQLResultsTempTableColumns
from tempdb.sys.columns where object_id =
object_id('tempdb..#PrintSQLResultsTempTable');
select @cols =
stuff((
(select ' , space(1) + LEFT(CAST([' + name + '] as nvarchar('+CAST(@padding as nvarchar(4))+')) + space('+ CAST(@padding as nvarchar(4)) +'), '+CAST(@padding as nvarchar(4))+') ' as [text()]
FROM #PrintSQLResultsTempTableColumns
where name != 'ID12345XYZ'
FOR XML PATH(''), root('str'), type).value('/str[1]','nvarchar(max)'))
,1,0,'''''');
select @displayCols =
stuff((
(select space(1) + LEFT(name + space(@padding), @padding) as [text()]
FROM #PrintSQLResultsTempTableColumns
where name != 'ID12345XYZ'
FOR XML PATH(''), root('str'), type).value('/str[1]','nvarchar(max)'))
,1,0,'');
DECLARE
@tableCount int = (select count(*) from #PrintSQLResultsTempTable);
DECLARE
@i int = 1,
@ii int = case when @tableCount < @numberToDisplay then @tableCount else @numberToDisplay end;
print @displayCols -- header
While @i <= @ii
BEGIN
set @sql = N'select @printableResults = concat(@printableResults, ' + @cols + ', @NewLineChar) from #PrintSQLResultsTempTable where ID12345XYZ = ' + CAST(@i as varchar(3))
--print @sql
execute sp_executesql @sql, N'@NewLineChar char(2), @printableResults nvarchar(max) output', @NewLineChar = @NewLineChar, @printableResults = @printableResults output
print @printableResults
SET @printableResults = null;
SET @i += 1;
END
例如:
exec [dbo].[PrintSQLResults] n'select * from MyTable'
这个SP不起作用,无论我给它的查询是什么说'我的查询附近有不正确的语法' – 2016-02-21 08:49:58
这适用于SQL Server 2014上的我。现在测试其他版本。 – 2016-02-22 16:26:10
已更新该帖子以包含2008 R2,2012和2014版本的工作版本。 – 2016-02-22 16:54:16
如果你用它看作XML OK:
DECLARE @xmltmp xml = (SELECT * FROM table FOR XML AUTO)
PRINT CONVERT(NVARCHAR(MAX), @xmltmp)
虽然作为问OP的问题并不一定需要这个,这是如果你来到这里寻找到打印多行/列(内有用原因)。
这是_amazing_!有很多情况下,您想使用'PRINT'来转储结果并为其添加自定义过程是非常困难的工作。好的解决方案 – Rory 2016-04-24 19:53:47
是的,我已经在SSMS中使用了这种方法,其中添加SELECT * FROM会导致其他应用程序/用户出现问题。 – 2016-04-25 00:05:13
尝试此查询
DECLARE @PrintVarchar nvarchar(max) = (Select Sum(Amount) From Expense)
PRINT 'Varchar format =' + @PrintVarchar
DECLARE @PrintInt int = (Select Sum(Amount) From Expense)
PRINT @PrintInt
- 1. 使SQL查询结果'PRINT'?
- 2. PHP打印只为SQL查询结果选择行
- 3. 从Genie打印选择查询的结果
- 4. 打印SQL查询结果在单行
- 5. 打印SQL查询结果PHP
- 6. SQL查询的打印结果
- 7. Codeigniter打印查询结果
- 8. 打印PDO查询结果
- 9. 打印查看BigQuery的查询结果
- 10. SQL Server CACHES查询结果?
- 11. SQL Server:打印生成的SQL查询
- 12. Mysql在Select查询结果上选择查询。
- 13. 选择SQL查询的一些结果
- 14. 选择sql查询合并结果
- 15. SQL Server查询选择
- 16. 为sql server选择查询
- 17. SQL Server:选择子查询结果的总和,ConnectWise数据库
- 18. SQL Server 2005将变量设置为选择查询的结果
- 19. SELECT查询选择
- 20. Ye olde UnicodeEncodeError从MS SQL查询打印结果与adodbapi
- 21. 在SQL Server中处理查询结果
- 22. SQL Server SELECT其中值等于另一个选择的结果
- 23. SQL选择打印出存储过程的结果
- 24. PRINT不打印动态sql
- 25. SQL Server:结合查询结果
- 26. MS SQL Server 2008/2012高速缓存SELECT查询结果
- 27. 从SQL Server中的select查询中联合多个结果
- 28. 在SQL Server中对SELECT查询结果进行复杂处理
- 29. SQL Server Management Studio的默认查询结果来自“Select top 1000”
- 30. 显示结果选择查询,使用一个选择查询
摆振 - 感谢选择我的答案为“”的答案。 – 2009-12-22 03:17:30
有关打印值而不是打印表格或结果集的问题。无论哪种情况,语言都不允许将子查询作为PRINT命令的参数。 [这是另一个SO问题和答案](https://stackoverflow.com/a/5193984/3368958),它显示了一个非常类似于参考PRINT文档的例子。 – 2016-11-30 19:26:14