【发布时间】:2015-02-03 14:39:55
【问题描述】:
我有一个 log 表有一个包含日志内容的 xml 列
还有一个名为logType的表,它是日志的类型
我需要创建将 xml 内容描述为可读字符串的查询
我在 logtype 表中添加了一个名为 logXPath 的列
我创建了以下查询
SELECT contents.value(LogXPath, 'nvarchar(max)')
FROM dbo.Log
JOIN dbo.LogType ON dbo.Log.logTypeID = dbo.LogType.logTypeID
我收到以下错误
XML数据类型方法“value”的参数1必须是字符串字面量
我搜索了一种方法来做到这一点,但没有结果!!
Sql Server XML Column中是否有做动态xpath?
编辑
例如假设以下架构和数据
CREATE TABLE [dbo].[logType]
(
[logTypeID] [int] NOT NULL ,
[logTypeName] [nvarchar](50) NOT NULL ,
[xPath] [nvarchar](MAX) NOT NULL ,
CONSTRAINT [PK_logType] PRIMARY KEY CLUSTERED ( [logTypeID] ASC )
)
GO
INSERT [dbo].[logType]
( [logTypeID] ,
[logTypeName] ,
[xPath]
)
VALUES ( 1 ,
N'Patient Data' ,
N'(/Patient/PatientName)[1]'
)
INSERT [dbo].[logType]
( [logTypeID] ,
[logTypeName] ,
[xPath]
)
VALUES ( 2 ,
N'Clinic Data' ,
N'(/Clinic/ClinicName)[1]'
)
/****** Object: Table [dbo].[log] Script Date: 02/04/2015 13:58:47 ******/
GO
CREATE TABLE [dbo].[log]
(
[logID] [int] NOT NULL ,
[logTypeID] [int] NOT NULL ,
[Contents] [xml] NULL ,
CONSTRAINT [PK_log] PRIMARY KEY CLUSTERED ( [logID] ASC )
)
GO
INSERT [dbo].[log]
( [logID] ,
[logTypeID] ,
[Contents]
)
VALUES ( 1 ,
1 ,
N'<Patient><PatientID>1</PatientID><PatientName>john</PatientName></Patient>'
)
INSERT [dbo].[log]
( [logID] ,
[logTypeID] ,
[Contents]
)
VALUES ( 2 ,
2 ,
N'<Clinic><ClinicID>1</ClinicID><ClinicName>Clinic 1</ClinicName></Clinic>'
)
当我进行如下查询时,它给了我错误
SELECT logTypeName ,
[Contents].value(dbo.logType.xPath, 'nvarchar(max)') AS data
FROM dbo.[log]
JOIN dbo.logType ON dbo.[log].logTypeID = dbo.logType.logTypeID
【问题讨论】:
-
将整个
SELECT语句作为动态SQL执行怎么样? -
问题是我的 xpath 不能是它存储在 sql 列中的变量,并且每个 logtype 具有不同的值,并且每个 logtype 的 xml 结构都不同所以如果我想使用动态 sql 我有为每个日志类型创建一个查询,但我需要在一个查询中获取
-
请提供样本数据。所以我们检查一下。
-
完成,我写了一个完整的例子
标签: sql-server xml xpath xquery-sql