我正在尝试通过Microsoft.FSharp.Data.TypeProviders.SqlDataConnection类型访问现有数据库。有一些存储过程未提供(但大多数都是)。
我正在尝试确定不可提供的程序与其他程序的区别 - 我认为自定义类型是类型提供可能失败的一个原因,但它们似乎不存在于此处。
由于其他原因,我们的存储过程可能无法提供?
编辑:
我已将以下块识别为导致无法提供的块:
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
...我认为这是因为正在“执行”的sproc也有从temp表返回值的路径。
答案 0 :(得分:4)
我假设类型提供程序无法获取存储过程(或其他数据库对象),因为类型提供程序无法获取有关结果集的元数据。检查sp_describe_first_result_set 和SET FMTONLY
原因在备注部分的文件中指明:
sp_describe_first_result_set在以下任何一种情况下都会返回错误。
如果输入的@tsql不是有效的Transact-SQL批处理。有效性通过解析和分析Transact-SQL批处理来确定。在确定Transact-SQL批处理是否有效时,不会考虑在查询优化期间或执行期间由批处理引起的任何错误。
如果@params不是NULL并且包含一个字符串,该字符串不是参数的语法上有效的声明字符串,或者它包含一个多次声明任何参数的字符串。
如果输入的Transact-SQL批处理声明了一个与@params中声明的参数同名的局部变量。
如果声明使用临时表。
该查询包括创建一个永久表,然后查询。
当在批处理中找到多个可能的第一个语句时,它们的结果可能在列数,列名,可为空性和数据类型方面有所不同。如何处理这些差异在这里有更详细的描述:
如果列数不同,则抛出错误并且不返回任何结果。
如果列名不同,则返回的列名设置为NULL。
可空性不同,返回的可空性将允许NULL。
如果数据类型不同,则会抛出错误,除以下情况外不会返回任何结果:
varchar(a)到varchar(a')其中a' >一个。
varchar(a)到varchar(max)
nvarchar(a)到nvarchar(a')其中a' >一个。
nvarchar(a)到nvarchar(max)
varbinary(a)到varbinary(a')其中a' >一个。
varbinary(a)到varbinary(max)
包含上述案例的数据库对象和查询根本不存在。
检查TSQL存储过程是否返回正确的元数据
SELECT * FROM sys.dm_exec_describe_first_result_set ('[schema].[name]',<params> , 0)
;