[英]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);
此方法有更多信息閱讀備注部分的限制
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.