0

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

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

我需要采用我们目前拥有的东西,并制作一个仅限 SQL 的版本。

所以,这是我需要的要求:

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

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

在存储过程中,我尝试了OPENROWSET、exec()、select into、xml等方法的各种组合。似乎没有一个工作。

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

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

exec sp_executeSQL @SQL, N'@output xml output', @resultXML output

其中@resultXML 是XML 数据类型,@SQL 是sql 命令。无论我做什么,@resultXML 总是以 null 结束。我也尝试了 xml 路由,因为我知道“FOR XML Path”总是返回一列,但我不能在插入语句中使用它......

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

我想一旦我克服了这个障碍,剩下的就是小菜一碟了。有人有什么想法吗?

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

DECLARE @curRecordString varchar(max) = 'SELECT * into ##TEMP_TABLE FROM SOMEDB.dbo.' + @tbl + ' WHERE ' + @prikey + ' = ''' + @prival + ''' '
exec(@curRecordString)

基本上,如前所述,我需要动态构建一个 sql 查询,然后存储运行查询的结果,以便我以后可以访问它。我更愿意将它存储为 XML 数据类型,因为稍后我将使用 XQuery 来解析和比较节点。在上面的代码中,我使用了一个全局临时表(我知道这并不理想)来存储查询结果,以便我的程序的其余部分可以访问数据。

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

4

1 回答 1

0

这绝对是一个黑客,但是......

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
于 2013-06-06T20:02:07.063 回答