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

sen*_*hin 6 sql sql-server

假设我有以下SQL(如果您愿意,可以针对数据资源管理器运行):

SELECT COUNT(Id) AS "Count" 
  INTO #temp 
  FROM Posts

PRINT (SELECT * FROM #temp)
Run Code Online (Sandbox Code Playgroud)

这会产生错误:

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

现在,在这种情况下,我知道这#temp是一行和一列的表,因此(SELECT * FROM #temp)只产生一个值.有没有办法说服SQL Server将其视为标量?

我知道我可以将它保存到变量然后PRINT改为:

DECLARE @count int = (SELECT * FROM #temp)
PRINT @count
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ith 5

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

除了在同一范围内分配变量之外,执行此操作的唯一方法是尽可能将selectUDF 包装在UDF中.

文件的国家

PRINT msg_str | @local_variable | string_expr

msg_str是字符串或Unicode字符串常量.有关更多信息,请参见常量(Transact-SQL).

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

string_expr是一个返回字符串的表达式.可以包含连接的文字值,函数和变量.有关更多信息,请参阅表达式(Transact-SQL).

因此,假设"函数"包括用户定义的函数而不仅仅是内置函数,这将起作用.否则你运气不好.

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