1

这段代码工作正常,但我有兼容级别为 80 的 SQL2005,所以我不能使用它。

OUTER APPLY为了使用t.Parameters列作为参数来运行,我应该用什么代替?

DECLARE @task TABLE
(
    ActionTaskId BIGINT,
    [Parameters] VARCHAR(512)
)

INSERT INTO @task
SELECT 1, '{"A":"#FFFFFF","B":"#000000"}' UNION
SELECT 2, '{"A":"#EEEEEE","B":"#000000"}'

SELECT *, OA1.Val 
FROM @task AS t
OUTER APPLY (SELECT * FROM [dbo].[parseJSON](t.[Parameters]) AS pj WHERE pj.Name='A') OA1

所需输出:

ActionTaskId | Val
----------------
1 | #FFFFFF     
2 | #EEEEEE
4

2 回答 2

0
SELECT *
    , (
        SELECT MAX (pj.Val)
        FROM [dbo].[parseJSON](t.[Parameters]) AS pj
        WHERE pj.Name='A'
    )
FROM @task AS t

顺便说一句,你能展示一下 parseJSON 函数里面的内容吗?只是有趣。

于 2013-08-01T14:17:03.160 回答
0

如果您有少量数据,则有解决方法(效率不高):

SELECT *
    , 'A' = [dbo].[fsParseJSON](t.[Parameters], 'A') 
    , 'B' = [dbo].[fsParseJSON](t.[Parameters], 'B')
FROM @task AS t

标量函数如下所示:

CREATE FUNCTION fsParseJSON 
(
    @Json varchar(4000), @Name VARCHAR(128)
)
RETURNS varchar(128)
AS
BEGIN
    DECLARE @Result varchar(128)

    SELECT @Result = [pj].[StringValue]
    FROM [dbo].[parseJSON](@Json) AS pj
    WHERE [pj].[Name] = @Name

    RETURN @Result

END
GO
于 2013-08-02T09:02:10.863 回答