0

我们有一种情况,我们需要在我们的 sql server 中存储表单数据,但是我们设置的每个新作业都会有不同的字段,具有不同的字段名称和长度。一个例子

Job 1:
    Field 1: first_name - varchar(20)
    Field 2: last_name - varchar(30)

Job 2:
    Field 1: first_name - varchar(15)
    Field 2: middle_initial - varchar(1)
    Field 3: last_name - varchar(30)

最初,我们设置了单独的表来存储这些数据,这些数据完全符合所讨论的形式。但这导致了维护的噩梦,因为有太多的表、procs、dts、ssis 包每次都要更改,以适应这些数据的动态特性。

我们提出了一种不同的解决方案,将所有数据存储在 xml 字段中,从而解决了大部分问题。它现在与此类似。

<Record>
  <first_name>value</first_name>
  <last_name>value</last_name>
</Record>

然后我们将创建视图以将这些数据从表中提取出来

SELECT
,  IsNull(data.value('(/Record/first_name)[1]', 'varchar(20)'),'') as first_name
,  IsNull(data.value('(/Record/last_name)[1]', 'varchar(30)'),'') as last_name
FROM FormTable

现在这比我们以前的要好得多,但这也意味着我们仍然需要每次都创建自定义视图。我更愿意维护某种类型的表来列出字段并为我构建该查询。

Field Name | Field Type | Field Length
first_name | varchar    | 20
last_name  | varchar    | 30

我很确定我无法创建动态视图。一个可行的选择是表值函数。但是有什么我在这里忽略的吗?是否有更好的选择能够以这种方式动态存储数据(无需离开 SQL SERVER,因为我知道 CouchDB 等其他数据库会在本地执行此操作。)

4

1 回答 1

0

我很确定表值函数不起作用,因为您不能使用动态 sql 或临时表(您几乎肯定需要使用它们来执行此操作)。

存储过程将是显而易见的选择——它可以做你需要做的一切,但问题当然是你不能从存储过程中选择。

我正在查看此页面,该页面讨论了执行此类操作的一系列选项。他提到的选项之一是使用 OPENQUERY,这似乎很容易,但可能存在性能问题:

SELECT * FROM OPENQUERY(LOCALSERVER, 'EXEC sp_getformdata')

无论如何,您可能想查看该链接以获得一些额外的想法。

于 2009-07-02T18:21:09.797 回答