簡體   English   中英

我可以將帶有一行和一列的子查詢視為標量嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM