Sql 将键值行视为多列单行

Sql 将键值行视为多列单行,sql,sql-server,common-table-expression,Sql,Sql Server,Common Table Expression,将参数x、y、z存储为键值 您希望对这些参数执行表达式z=x+y。表达式存储在另一个表中 您希望尽可能简单地从表达式生成SQL查询 如何将这些参数值视为具有列(x、y、z)的单行,以启用表达式的执行 SELECT * INTO #key_values FROM ( SELECT 'x' AS mykey, 2 AS myvalue UNION ALL SELECT 'y', 5 UNION ALL SELECT 'z', 0 ) a; 使用公共表表达式将

将参数x、y、z存储为键值

您希望对这些参数执行表达式z=x+y。表达式存储在另一个表中

您希望尽可能简单地从表达式生成SQL查询

如何将这些参数值视为具有列(x、y、z)的单行,以启用表达式的执行

SELECT *
 INTO #key_values
FROM
(
SELECT 'x' AS mykey, 2 AS myvalue
UNION ALL
SELECT 'y',          5
UNION ALL
SELECT 'z',          0
) a;

使用公共表表达式将3行转换为单个3列行,并更新以运行表达式。因此,建议的解决方案是一个可更新的cte

WITH myvalues(x,y,z) AS (
    SELECT x.myvalue, y.myvalue, z.myvalue 
    FROM #key_values AS x
    JOIN #key_values AS y ON y.mykey='y' AND x.mykey='x'
    JOIN #key_values AS z ON z.mykey='z'
)
UPDATE myvalues SET z=x+y;

SELECT myvalue FROM #key_values WHERE mykey='z';

这对
PIVOT
操作员来说非常重要:

;WITH Inputs AS
(
    SELECT 'x' AS mykey, 2 AS myvalue
    UNION ALL
    SELECT 'y',          5
    UNION ALL
    SELECT 'z',          0
)
SELECT
    U.x,
    U.y,
    U.z,
    Result = U.x + U.y
FROM
    Inputs AS I
    PIVOT (
        MAX(I.myvalue) FOR I.mykey IN (x, y, z)
    ) AS U
结果:

x   y   z   Result
2   5   0   7
您可以使用
SELECT
中的数据透视列构建任意表达式


如果要更新
z
记录,则必须重新连接到基础表,因为在应用
PIVOT
后,您将无法访问原始表

IF OBJECT_ID('tempdb..#Input') IS NOT NULL
    DROP TABLE #Input

CREATE TABLE #Input (
    mykey VARCHAR(10),
    myvalue INT)

INSERT INTO #Input (
    mykey,
    myvalue)
VALUES
    ('x', 2),
    ('y', 5),
    ('z', 0)

UPDATE I SET
    myvalue = R.Result
FROM
    #Input AS I
    CROSS APPLY (
        SELECT
            Result = x + y
        FROM
            #Input AS I
            PIVOT (MAX(I.myvalue) FOR I.mykey IN (x, y, z)) AS U
        ) AS R
WHERE
    I.mykey = 'z'

“表达式以输入数据的形式提供。”这是什么意思?更改为“表达式存储在另一个表中”。我想从表达式生成一个查询。它实际上是一个动态SQL,使用表达式作为输入生成查询字符串。确实相关。想知道我如何可以毫无痛苦地更新z。将Result=U.x+U.y替换为Result=x+y。是否可以删除“For I.mykey IN(x,y,z)”的枢轴约束?我们能告诉它创建所有可能的列吗?@LudovicAubert然后你必须做一个动态透视(使用动态SQL)。有关PIVOT/UNPIVOT的完整示例