假设我有以下SQL(如果您愿意,可以是run against the Data Explorer):
SELECT COUNT(Id) AS "Count"
INTO #temp
FROM Posts
PRINT (SELECT * FROM #temp)
这会产生错误:
“在此上下文中不允许使用子查询。只允许使用标量表达式。”
现在,在这种情况下,我知道#temp
是一行和一列的表,因此(SELECT * FROM #temp)
将只生成一个值。有没有办法说服SQL Server将其视为标量?
我知道我可以将其保存到变量中,然后PRINT
代替:
DECLARE @count int = (SELECT * FROM #temp)
PRINT @count
但这似乎是一个不必要的额外步骤。
答案 0 :(得分:0)
据我所知,不,不。即使像PRINT (SELECT 1)
或PRINT (SELECT TOP (1) 1)
那样简单的陈述也会失败。
我的猜测是,PRINT根本不会执行任何类型的SQL来防止可能的注入。毕竟,PRINT不是EXEC。这意味着将一个字符串消息返回给客户端。
答案 1 :(得分:0)
不。打印不是查询方法。它只是打印值。看起来你不需要临时表。
Declare @Count int
select @Count = COUNT(*)
from Posts
Print @Count
答案 2 :(得分:0)
PRINT(Transact-SQL)
将返回用户定义的消息返回给客户端。PRINT msg_str | @local_variable | string_expr
msg_str
是字符串还是Unicode字符串常量。有关更多信息,请参阅常量(Transact-SQL)。@local_variable
是任何有效字符数据类型的变量。 @local_variable必须是char,nchar,varchar或nvarchar,或者必须能够隐式转换为这些数据类型。string_expr
是一个返回字符串的表达式。可以包含连接的文字值,函数和变量。有关更多信息,请参阅表达式(Transact-SQL)。
对此没有任何查询或子查询的使用。
表达式(Transact-SQL)
{ constant | scalar_function | [ table_name. ] column | variable | ( expression ) | ( scalar_subquery ) | { unary_operator } expression | expression { binary_operator } expression | ranking_windowed_function | aggregate_windowed_function }
答案 3 :(得分:0)
根据文件: Restart-Service
PRINT
需要一个可以设置为相当大的数据流的变量,但它必须是单个变量。
如果您尝试使用PRINT
进行调试似乎是多余的,则必须先将其设置为变量。我想不出任何其他方式。