我可以将带有一行和一列的子查询视为标量吗?

时间:2015-07-14 20:48:53

标签: sql sql-server

假设我有以下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

但这似乎是一个不必要的额外步骤。

4 个答案:

答案 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进行调试似乎是多余的,则必须先将其设置为变量。我想不出任何其他方式。