2015-04-16 39 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);