Column with SQL table is read-only, and cells cannot be edited?

If I create a VIEW using this pivot table query, it is not editable. The cells are read-only and give me error SQL2005: "No row was updated. The data in row 2. was not committed. Updating or inserting the view or VIEWNAME function failed because it contains a derived or constant field."

Any ideas on how this can be solved OR is it a core that just cannot be edited?

SELECT     n_id,
MAX(CASE field WHEN 'fId' THEN c_metadata_value ELSE ' ' END) AS fId,
MAX(CASE field WHEN 'sID' THEN c_metadata_value ELSE ' ' END) AS sID,
MAX(CASE field WHEN 'NUMBER' THEN c_metadata_value ELSE ' ' END) AS NUMBER
FROM   metadata
GROUP BY n_id
0
source share
2 answers

You need to create a trigger to view because direct updating is not possible:

CREATE TRIGGER TrMyViewUpdate on MyView
INSTEAD OF UPDATE
AS
BEGIN
   SET NOCOUNT ON;
   UPDATE MyTable
   SET ...
   FROM INSERTED...
END
+2
source

, n_id, field, , , (, ) INSTEAD OF.

MERGE ( SQL Server 2008), UPDATES , INSERTS ( NULL NON NULL > one) DELETES, NON NULL NULL.

, , - , UPDATES, NULL. , , n_id ( , UPDATE). , VIEW OUTER JOIN , - n_id PK.

. INSERT/DELETE, - .

CREATE TRIGGER trig
ON pivoted
INSTEAD OF UPDATE
AS
  BEGIN
      SET nocount ON;

      DECLARE @unpivoted TABLE (
        n_id             INT,
        field            VARCHAR(10),
        c_metadata_value VARCHAR(10))

      INSERT INTO @unpivoted
      SELECT *
      FROM   inserted UNPIVOT (data FOR col IN (fid, sid, NUMBER) ) AS unpvt
      WHERE  data IS NOT NULL

      UPDATE m
      SET    m.c_metadata_value = u.c_metadata_value
      FROM   metadata m
             JOIN @unpivoted u
               ON u.n_id = m.n_id
                  AND u.c_metadata_value = m.field;

      /*You need to consider race conditions below*/
      DELETE FROM metadata
      WHERE  NOT EXISTS(SELECT *
                        FROM   @unpivoted u
                        WHERE  metadata.n_id = u.n_id
                               AND u.field = metadata.field)

      INSERT INTO metadata
      SELECT u.n_id,
             u.field,
             u.c_metadata_value
      FROM   @unpivoted u
      WHERE  NOT EXISTS (SELECT *
                         FROM   metadata m
                         WHERE  m.n_id = u.n_id
                                AND u.field = m.field)
  END  
+3

Source: https://habr.com/ru/post/1788812/


All Articles