Sql 我可以将一行一列的子查询视为标量吗?
假设我有以下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
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
}