Sql server SQL Server 2012将XML插入表问题

Sql server SQL Server 2012将XML插入表问题,sql-server,stored-procedures,Sql Server,Stored Procedures,我正在尝试创建一个通用的更新过程。这个过程的要点是,我们希望能够跟踪表中发生的所有事情。如果一条记录被更新,我们需要知道是谁更改了该记录,它最初是什么,更改后是什么,以及更改发生的时间。我们只在最重要的表上这样做,而这些表必须有责任感 现在,我们通过web服务器编程和SQL server命令的组合来实现这一点 我需要使用我们目前拥有的,并制作一个仅SQL版本 因此,以下是我需要的要求: 原始sp称为UpdateWithHistory。现在,它需要4个参数全部为varchar(也可以是nvarch

我正在尝试创建一个通用的更新过程。这个过程的要点是,我们希望能够跟踪表中发生的所有事情。如果一条记录被更新,我们需要知道是谁更改了该记录,它最初是什么,更改后是什么,以及更改发生的时间。我们只在最重要的表上这样做,而这些表必须有责任感

现在,我们通过web服务器编程和SQL server命令的组合来实现这一点

我需要使用我们目前拥有的,并制作一个仅SQL版本

因此,以下是我需要的要求:

原始sp称为UpdateWithHistory。现在,它需要4个参数全部为varchar(也可以是nvarchar,没关系)。它们是表名、主键字段、主键值以及字段和值的逗号分隔列表,格式为field='value',field1='value1'…等

在后台,我们有一个映射表,用于将字符串表名映射到实际表

在存储过程中,我尝试了OPENROWSET、exec()、select-into、xml和其他方法的各种组合。似乎都不管用

因此,基本上,我必须能够从提供的4个参数动态生成一个简单的select语句(没有连接或其他复杂的select内容),然后将查询结果存储在一个表中。因为它是动态的,所以我不知道要查询的字段的数量,或者它们将是什么数据类型

我尝试了select into,因为它会自动创建一个具有适当字段和数据类型的表,但它不能与exec命令配合使用。我也试过了

exec sp_executeSQL @SQL, N'@output xml output', @resultXML output
其中@resultXML是XML数据类型,@SQL是SQL命令@无论我做什么,resultXML总是以null结尾。我还尝试了xml路由,因为我知道“FOR xml Path”总是返回一列,但我不能在insert into语句中使用它

该语句输出将用于在更新之前确定原始值

我想一旦我越过了这个障碍,剩下的将是小菜一碟。有人有什么想法吗

这是我终于开始工作的代码,虽然我不想使用全局表,所以我很乐意接受不同的答案

DECLARE @curRecordString varchar(max) = 'SELECT * into ##TEMP_TABLE FROM SOMEDB.dbo.' + @tbl + ' WHERE ' + @prikey + ' = ''' + @prival + ''' '
exec(@curRecordString)
基本上,如前所述,我需要动态构建一个sql查询,然后存储运行查询的结果,以便以后可以访问它。我更愿意将其存储为XML数据类型,因为稍后我将使用XQuery解析和比较节点。在上面的代码中,我使用一个全局临时表(我知道这并不理想)来存储查询结果,以便我的过程的其余部分可以访问数据


正如我所说,我不喜欢这种方法,但希望其他人能想出更好的方法,让我能够动态构建SQL查询,运行它,存储结果,以便我以后可以在存储过程中访问结果。

这肯定是一种黑客行为,但是

DECLARE @s VARCHAR(MAX)
SET @s = 'SELECT (SELECT 1 as splat FOR XML PATH) a'

CREATE TABLE #save (x XML)

INSERT INTO #save
        ( x )
EXEC (@s)


SELECT  * FROM #save s

DROP TABLE #save

你为什么不干脆用?第一,我不知道那是什么。第二,我公司使用的系统已有10多年的历史,最初是在经典的asp和VBScript出现时设计的。所以我们所做的任何事情都需要遵循这个旧的系统。我遵循了你的链接,看起来它在大多数情况下都会起作用,但我的不行,因为我的老板想把他几年前创建的所有跟踪历史记录保存在这个表中……向你的老板介绍解决方案,并向他解释使用他的旧方案与使用这个方案的成本/收益如何?使用一些旧表有什么价值?如果您告诉我们SQL Server(2000、2005、2008、2012?)的最初版本可能是SQL Server 2000,可能会有所帮助。现在是2012年,所以我们可以使用更新的技术。而且他在做出不符合当前工作方式的改变时非常死板。我花了好几个月的时间才让他在我们目前的系统中使用AJAX,所以我不认为这是一场我能赢的战斗。此外,我们当前使用的系统都是自主开发的,有许多钩子连接到这个历史表中,因此从他的角度来看,重写数千行代码(与更新和维护旧历史表相关)的成本和收益并没有那么大的好处。如果在内部Select查询中指定一个表,这是行不通的。您会得到错误“Msg 116,Level 16,State 1,Line 2,当子查询没有引入EXISTS时,只能在选择列表中指定一个表达式。”嗯,我只是用一个表尝试了一下,它对我有效。你能发布一个你尝试过的版本吗?我确实设置了@s='SELECT(SELECT*fromtable FOR XML PATH)a'我在解释我对你们做了什么的时候发现了我做错了什么。我将SELECT 1更改为SELECT*,然后将表包含在splat和FOR之间。我忘了删除“as splat”。当我移除它时,它工作得很好。另外,我发誓我试过类似于你上面所说的东西,但我无法让它工作,但由于某种原因,它现在工作了,所以我会继续说它很好。谢谢