F#SQL类型提供程序 - 为什么不提供所有存储过程?

时间:2015-04-16 15:12:19

标签: linq-to-sql f# type-providers

我正在尝试通过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表返回值的路径。

1 个答案:

答案 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);