2015-04-16 152 views
4

我想通過Microsoft.FSharp.Data.TypeProviders.SqlDataConnection類型訪問現有的數據庫。有一些沒有提供的存儲過程(但大多數是)。F#SQL類型提供程序 - 爲什麼不提供所有存儲過程?

我想確定什麼區別不可取的程序與其他人 - 我相信自定義類型是類型提供可能失敗的原因之一,但他們似乎並沒有出現在這裏。

爲什麼其他原因可能導致我們的存儲過程不可靠?

編輯:

我已經確定了以下塊作爲一個引起unprovidability:

 EXEC @intReturn = te_audit_log @action = 'I', 
            @user_id = @intUserId, 
            @table_id = 1, 
            @audit_action = 'A', 
            @data_id = @intStatus, 
            @session_guid = @session_guid, 
            @effective_date = @actual_timedate, 
            @employee_id = @employee_id 

...我認爲這是因爲正在「執行」編輯也有路徑的存儲過程從臨時表中返回值。

+0

只是猜測:也許那些有輸出參數的SP沒有提供。 – Petr

+0

我現在在其中的一個分支中查看,從它創建的#temp表中執行SELECT操作。當我刪除它時,F#能夠提供存儲過程。 –

+0

可能是因爲它無法執行[sp_describe_first_result_set](https://msdn.microsoft.com/en-us/library/ff878602.aspx)或sys.dm_exec_describe_first_result_set並返回元數據。當SP包含臨時表時,我觀察到了這一點。從文檔「sp_describe_first_result_set在下列任何情況下都會返回錯誤 - 如果語句使用臨時表」。 – lad2025

回答

4

我認爲類型提供程序無法獲取存儲過程(或其他數據庫對象),因爲類型提供程序無法獲取有關結果集的元數據。檢查sp_describe_first_result_setSET FMTONLY

原因是在documenation在備註欄規定:

sp_describe_first_result_set在任何下列情況下會返回一個錯誤。

如果輸入@tsql不是有效的Transact-SQL批處理。通過解析和分析Transact-SQL批處理確定有效性。查詢優化過程中或執行過程中所造成的批次的任何錯誤判斷Transact-SQL批處理是否有效時不予以考慮。

如果@params不爲空,幷包含一個字符串,它是不適合的參數語法上有效的聲明字符串,或者如果它包含一個聲明的任何參數超過一次的字符串。

如果輸入Transact-SQL批處理聲明相同的名稱@params中聲明的參數的局部變量。

如果聲明使用臨時表

該查詢包括創建一個永久表,然後查詢。

當多個可能的第一語句在批處理中找到,其結果可以在列數,列名,爲空,與數據類型而不同。如何將這些不同的處理方式在這裏更詳細地描述:

如果列數不同,則會引發錯誤,並返回結果。

如果列名不同,則返回的列名設置爲NULL。

它的可空性不同,返回的可空性將允許NULL。

如果數據類型的不同,誤差將被拋出並沒有返回結果,除了以下情況:

  • VARCHAR(a)至VARCHAR(A ')其中,A'>一個。

  • VARCHAR(a)至VARCHAR(最大)

  • nvarchar的(a)中爲nvarchar(A ')其中,A'>一個。

  • nvarchar的(a)中爲nvarchar(最大)

  • VARBINARY(a)至VARBINARY(A ')其中,A'>一個。

  • VARBINARY(a)至VARBINARY(最大)

DB對象和包含上述情況下查詢是根本不存在。

察看TSQL存儲過程返回正確的元數據

SELECT * FROM sys.dm_exec_describe_first_result_set ('[schema].[name]',<params> , 0);