创建包含未知数据类型的包装器

时间:2016-02-19 16:15:19

标签: sql-server tsql

我试图在T-SQL中创建一个包装器,用于我不确定数据类型是什么的过程。我可以在没有INSERT INTO语句的情况下运行包装器,我可以很好地获取数据,但我需要将它放在一个表中。

每当我使用INSERT INTO时,我都会收到错误:

  

列名或提供的值数与表定义不匹配

我已经通过我的代码进行了解析,无法查看任何列名称与之匹配的位置,因此我认为它必须是数据类型。我已经查看了包装过程,看看我是否可以找到数据类型,但有些数据类型没有定义;我引用了他们从中提取数据的表来查找定义;我在所有数据上运行SQL_VARIANT_PROPERTY以查看它是什么数据类型(尽管其中一些数据为空)。

我是否有更好的方法可以准确找到错误的位置?

2 个答案:

答案 0 :(得分:0)

我认为您可以使用sp_describe_first_result_set(可从SQL2012获得)和FMTONLY找到存储过程结果模式。像这样:

EXEC sp_describe_first_result_set
    @tsql = N'SET FMTONLY OFF; EXEC yourProcedure <params are embedded here>'

可以找到更多详细信息here

但是,如果我没记错的话,这只适用于你的程序使用确定性模式(没有SELECT INTO #tempTable或类似的东西)。

找出结果模式的一个技巧是将结果实际实现为ad-hoc创建的表。但是,这并不容易,因为SELECT INTO不适用于EXEC procedure。一个解决方法就是:

1)为实例本身定义链接服务器。例如。环回

2)执行这样的程序(对于SQL 2008R2):

    SELECT * INTO tempTableToHoldDataAndStructure
    FROM OPENQUERY(' + @LoopBackServerName + ', ''set fmtonly off exec ' + @ProcedureFullName + ' ' + @ParamsStr

,其中

@LoopBackServerName = 'loopback'
@ProcedureFullName = loopback.database.schema.procedure_name
@ParamsStr = embedded parameters

对于SQL2012我认为如果没有提供RESULT SETS,执行可能会失败(即预期结果的模式定义,在这种情况下是一种鸡蛋问题):

' WITH RESULT SETS (( ' +  @ResultSetStr + '))'');

答案 1 :(得分:0)

好的,我有解决问题的方法。这很乏味,但我能做的很乏味。随机猜测是让我发疯的原因。程序我包装转储51列。我已经知道我可以在不将任何东西放入表中的情况下使用它。所以我决定在我的包装过程中注释部分select语句,因此它只选择1列。 (首先,我制作了该程序的副本,因此我不会搞砸原件;然后我从我的包装器中引用了副本)。保存两者,运行它,它工作。到现在为止还挺好。我可以一行一行地完成它,但我更多的是一个二元的人,所以我走了一半 - 现在我在select语句和我的表中包括大约25列 - - 它还在工作重复该过程,直到它不再起作用,然后回溯直到它再次发生。我的错误在于识别其中一种数据类型,其后是&#34; IDENTITY&#34;。我不确定当我离开时会发生什么,但至少我的包装工作。