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

Sql 我可以将一行一列的子查询视为标量吗?,sql,sql-server,Sql,Sql Server,假设我有以下SQL,如果您愿意,可以: SELECT COUNT(Id) AS "Count" INTO #temp FROM Posts PRINT (SELECT * FROM #temp) 这会产生一个错误: 在此上下文中不允许子查询。只允许使用标量表达式 现在,在本例中,我知道temp是一个一行一列的表,因此SELECT*FROM temp将只生成一个值。有没有办法说服SQL Server将其视为标量 我知道我可以将其保存为变量,然后打印: DEC

假设我有以下SQL,如果您愿意,可以:

SELECT COUNT(Id) AS "Count" 
  INTO #temp 
  FROM Posts
  
PRINT (SELECT * FROM #temp)
这会产生一个错误:

在此上下文中不允许子查询。只允许使用标量表达式

现在,在本例中,我知道temp是一个一行一列的表,因此SELECT*FROM temp将只生成一个值。有没有办法说服SQL Server将其视为标量

我知道我可以将其保存为变量,然后打印:

DECLARE @count int = (SELECT * FROM #temp)
PRINT @count

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

据我所知,没有。即使像PRINT SELECT 1或PRINT SELECT TOP 1这样简单的语句也会失败


我猜想PRINT不会执行任何类型的SQL来防止可能的注入。毕竟是打印,不是执行。这意味着向客户端返回字符串消息。

不,根据语法,这是不可能的

除了在同一范围内指定变量之外,唯一的方法是将select尽可能地包装在UDF中 如我所见

美国

打印msg_str |@local_变量| string_expr

msg_str是字符串或Unicode字符串常量。更多 有关详细信息,请参阅Transact-SQL常量

@局部变量是任何有效字符数据类型的变量。 @局部变量必须是 char、nchar、varchar或nvarchar,或者必须能够隐式 转换为那些数据类型

string_expr是一个 返回一个字符串。可以包括串联的文字值、函数、, 和变量。有关详细信息,请参见表达式Transact-SQL

因此,假设函数包括用户定义的函数,而不仅仅是内置函数,这将起作用。否则你就倒霉了


对于您的特定用例,您肯定是运气不好,因为即使忽略为此创建标量UDF的荒谬性,他们也无法访问临时表。

不。打印不是一种查询方法。它只是打印值。看起来你不需要临时表来做这个

Declare @Count int
select @Count = COUNT(*) 
from Posts

Print @Count
打印Transact-SQL 向客户端返回用户定义的消息

PRINT msg_str | @local_variable | string_expr
msg_str 是字符串或Unicode字符串常量。有关详细信息,请参见常量Transact-SQL。 @局部变量 是任何有效字符数据类型的变量@局部变量必须是char、nchar、varchar或nvarchar,或者必须能够隐式转换为这些数据类型。 字符串表达式 是一个返回字符串的表达式。可以包括串联的文字值、函数和变量。有关详细信息,请参见表达式Transact-SQL。 没有任何类型的查询或子查询用于此

Transact-SQL表达式

根据文件:

打印需要一个变量,该变量可以设置为相当大的数据流,但必须是单个变量


虽然如果您试图使用PRINT进行调试,它看起来是多余的,但必须首先将其设置为变量。我想不出别的办法了

但可能还是一个标量函数:-有意义;我猜PRINT在这里是一种特殊的语言构造。@senshin嗯,至少它是从向存储过程传递参数到存储过程的一个进步,因为它们根本不接受任何类型的表达式。从我的问题中你不可能知道这一点,但我的实际用例涉及执行动态构造的SQL语句blech,我知道,所以我认为临时表实际上是必要的。动态sql有它的位置。没什么大不了的。这里真正的问题是,您将被迫为此使用一个变量。
{ constant | scalar_function | [ table_name. ] column | variable  
    | ( expression ) | ( scalar_subquery ) 
    | { unary_operator } expression 
    | expression { binary_operator } expression  
    | ranking_windowed_function | aggregate_windowed_function
}