1

mytable2の列の名前である「columnname」フィールドを含むテーブル「mytable」があります。

私はこれを選択に使用します:

SET @DptScn = (SELECT columnname FROM mytable WHERE tablename = 'CustomTableName' AND fieldlabel = 'CustomField');
SET @identifiedid=144;

しかし、私が試してみると:

SELECT @DptScn FROM mytable2 WHERE identifiedid = @identifiedid;

これにより、フィールドの内容ではなく、変数 @DptScn に含まれる名前が得られます...

何かアドバイス?トリガーにいるため、Prepared Statement を使用できません...

アップデート:

spencer7593 が示唆するように、プロシージャを作成しています。

DROP PROCEDURE IF EXISTS p_t;
DELIMITER $$
CREATE PROCEDURE p_t (IN DptTcn VARCHAR(255), IN tid INT, OUT tT INT)
BEGIN
    SET @DptTcn = DptTcn;
    SET @tid = tid;
    SET @sql = CONCAT('SELECT @DptTcn FROM mytable3 WHERE tid = @tid');
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
END$$
DELIMITER ;

それから私はそれを試します:

SET @DptTcn = (SELECT columnname mytable WHERE tablename = 'CustomTableName' AND fieldlabel = 'CustomField');
SET @identifiedid=145;
CALL proc_ticket(@DptTcn, @identifiedid, @DptT);

しかし、私は受け取ります:

#2014 - Commands out of sync; you can't run this command now
4

2 に答える 2

1

考慮すべきオプションの 1 つはPROCEDURE、準備済みステートメントを利用する を作成し、トリガーからストアド プロシージャを呼び出すことです。

特定の列から値を取得するために実行する SQL ステートメントには、SQL テキストで指定された column_name が必要です。これは、ステートメントの実行時に「動的に」導出することはできません。

このようなことを実現するには、2 つの別個のステートメントを実行する必要があります。1 つは column_name を取得します。2 番目は " SELECT column_name FROM" です。そして、その 2 番目のクエリを実行するための MySQL 提供のメカニズムは、準備済みステートメントです。


ファローアップ

これが例です。これを SQLFiddle に組み込んでみましたが、動作させることができませんでした (ハングしただけです。代わりに、mysql コマンド ライン クライアントからの出力を次に示します。

(//ストアド プロシージャの区切り記号としてセミコロンを使用できないため、以下のステートメントはすべて同じ区切り記号を使用します。SQLFiddle では、すべてのステートメントで同じ区切り記号を使用する必要があり、//たまたまオプションの 1 つですSQLFiddle で。)

mysql> DELIMITER //

mysql> CREATE PROCEDURE foo(IN colname VARCHAR(255), IN id INT, OUT val VARCHAR(255))
    -> BEGIN
    ->    -- handler for "Unknown column" and "No data" exceptions
    ->    DECLARE EXIT HANDLER FOR 1054, 1329 BEGIN SET val = NULL; END;
    ->    SET @sql = CONCAT('SELECT ',colname,' INTO @val FROM t WHERE id = ',id,' LIMIT 1');
    ->    PREPARE stmt FROM @sql;
    ->    EXECUTE stmt;
    ->    SET val = @val;
    -> END//
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE t (id INT, attr VARCHAR(4), ball VARCHAR(4))//
Query OK, 0 rows affected (0.11 sec)

mysql> INSERT INTO t VALUES (1, 'abcd','efgh'),(2,'ijkl','mnop')//
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> CALL foo('attr',1,@attr_1)//
Query OK, 0 rows affected (0.00 sec)

mysql> CALL foo('attr',2,@attr_2)//
Query OK, 0 rows affected (0.00 sec)

mysql> CALL foo('ball',1,@ball_1)//
Query OK, 0 rows affected (0.00 sec)

mysql> CALL foo('ball',2,@ball_2)//
Query OK, 0 rows affected (0.00 sec)

mysql> CALL foo('attr',777,@err_bad_id)//
Query OK, 0 rows affected (0.00 sec)

mysql> CALL foo('badcol',1,@err_badcol)//
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @attr_1
    ->      , @attr_2
    ->      , @ball_1
    ->      , @ball_2
    ->      , @err_bad_id
    ->      , @err_badcol//
+---------+---------+---------+---------+-------------+-------------+
| @attr_1 | @attr_2 | @ball_1 | @ball_2 | @err_bad_id | @err_badcol |
+---------+---------+---------+---------+-------------+-------------+
| abcd    | ijkl    | efgh    | mnop    | NULL        | NULL        |
+---------+---------+---------+---------+-------------+-------------+
1 row in set (0.00 sec)

mysql> DELIMITER ;
于 2013-07-17T18:18:00.177 に答える
0

SP を作成し、列名を指定する必要があります。

create proc dbo.TestGetData(@DptScn nvarchar(256))
as
  begin
    set nocount on
    DECLARE @SQL NVARCHAR(MAX)
    SET @SQL = 'SELECT @DptScn FROM mytable2 WHERE identifiedid = 144'
    exec sp_executesql @SQL, N'@DptScn nvarchar(256)', @DptScn =@DptScn 
end

それで

exec dbo.TestGetData 'Column1'
于 2013-07-17T18:32:05.017 に答える