簡體   English   中英

確定SQL Server查詢(存儲過程)結果類型

[英]Determine SQL Server query (stored procedure) result type

我計划將我的數據組織在SQL Server中作為我自己的一小部分,在我的代碼中為每個數據創建元數據類。

對於測試我是對對象進行硬編碼,下一步是使用SQL Server查詢生成每個對象的屬性。

現在我在C#中處理我的代碼的存儲過程部分,
我想知道如何以某種方式使用SQL Server查詢執行的命令的結果類型?

例如,在這里我們甚至通過閱讀它的名字就知道它在做什么......

[dbo].[GtallDrLFilesCount]

但另一個可以選擇其他類型的返回,如行集字符串等'

使用上面的存儲過程將返回一個int:

if(@AllDrives=1) Begin 
        Select 
          * From [dbo].[HddFolderFiles]
End

但是下一個(上面)選擇所有內容而不是RowsCount

我打算訪問SQL Server並查詢它的對象,因為我不打算設置返回參數(OUT),是否有更優雅的方法來實現它,而不是解析存儲過程的.sql文件?

就像文本包含SELECT * (這是一個行集)一樣,如果text包含Select COUNT(*) (這是int),則使用DataTable准備int類型變量。

我認為在我沒有為我的存儲過程分配一個out參數的情況下,SQL Server能以某種方式告訴返回類型,即使它沒有out參數來使它變得容易嗎?

我認為你必須執行SProc來獲取它的列,但你可以在不使用set fmtonly實際撤回數據的情況下執行它

甚至返回單個值的sprocs(例如 - int)在您使用c#時返回一個表...所以您只需要查看讀者的列以獲取所需的數據。

所以:

set fmtonly on
exec [dbo].[MyStoredProc] 0
set fmtonly off

將返回一個可以在c#中檢查的記錄集

var adoCon = new System.Data.SqlClient.SqlConnection(_sConnectStr);
var adoCmd = new System.Data.SqlClient.SqlCommand("your SQL (above)", adoCon);

var Rows = adoCmd.ExecuteReader();
DataTable dtSchema = Rows.GetSchemaTable();

現在 - 您可以瀏覽dtSchema以獲取列。 它不是純SQL,而是ac#+ SQL方法。 [dbo].[GtallDrLFilesCount]將返回單個列表(int類型的列)。

顯然 - 使用SQL命令(不是字符串)。 下一個技巧是將SQL類型轉換為本機c#類型(對於某些數據類型很容易,對其他數據類型很棘手......看看ADOCommand的ReturnProviderSpecificTypes選項)。

希望有所幫助!

SQL Server 2012+您可以使用sys.dm_exec_describe_first_result_set來讀取有關結果集的元數據:

此動態管理功能將Transact-SQL語句作為參數,並描述該語句的第一個結果集的元數據。

SELECT *
FROM sys.dm_exec_describe_first_result_set(
   N'EXEC [dbo].[MyProcedure]', NULL, 0);

SELECT *
FROM sys.dm_exec_describe_first_result_set(
   N'SELECT * FROM [dbo].[tab]', NULL, 0);

SqlFiddleDemo

此方法有更多信息閱讀備注部分的限制

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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