[英]Can I treat a subquery with one row and one column as a scalar?
假設我有以下SQL(如果您願意,可以針對數據資源管理器運行 ):
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
但這似乎是一個不必要的額外步驟。
根據語法,這是不可能的。
除了在同一范圍內分配變量之外,執行此操作的唯一方法是將select
包裝在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的荒謬,他們無論如何都無法訪問臨時表。
據我所知,不,不。 即使像PRINT (SELECT 1)
或PRINT (SELECT TOP (1) 1)
這樣簡單的語句也會失敗。
我的猜測是,PRINT根本不會執行任何類型的SQL來防止可能的注入。 畢竟,PRINT不是EXEC。 它的意思是將一個字符串消息返回給客戶端。
不。 打印不是查詢方法。 它只是打印值。 看來你不需要臨時表。
Declare @Count int
select @Count = COUNT(*)
from Posts
Print @Count
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 }
根據文檔: https : //msdn.microsoft.com/en-us/library/ms176047.aspx
PRINT
需要一個可以設置為相當大的數據流的變量,但它必須是單個變量。
雖然如果您嘗試使用PRINT
進行調試似乎是多余的,但您必須先將其設置為變量。 我想不出任何其他方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.