假设我有以下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)
但这似乎是一个不必要的额外步骤.
根据语法,这是不可能的.
除了在同一范围内分配变量之外,执行此操作的唯一方法是尽可能将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的荒谬,他们也无法访问临时表.