当前位置: 首页 > 知识库问答 >
问题:

无法使用触发器在动态SQL中绑定多部分标识符

杨飞语
2023-03-14

    CREATE TRIGGER TestDemo ON Consultants1 
    INSTEAD OF UPDATE
    AS
    DECLARE @Sql nvarchar(200),     
            @TableName nvarchar(50),
            @FieldName nvarchar(100),
            @PKCols VARCHAR(1000),  --Primary Key       
            @Value nvarchar(100)

    SET @TableName = 'Consultants1'
    SET @FieldName = 'DisplayName'
    SET @Value = 'Test123'

    SELECT * INTO #ins FROM inserted

    SELECT @PKCols = c.COLUMN_NAME 
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS pk ,
         INFORMATION_SCHEMA.KEY_COLUMN_USAGE c
    WHERE   pk.TABLE_NAME = @TableName
        AND CONSTRAINT_TYPE = 'PRIMARY KEY'
        AND c.TABLE_NAME = pk.TABLE_NAME
        AND c.CONSTRAINT_NAME = pk.CONSTRAINT_NAME

    SELECT @Sql = 'UPDATE ' + @TableName + ' SET '
    SELECT @Sql = @Sql + @FieldName + ' = ''' + @Value + ''''
    SELECT @Sql = @Sql + ' WHERE #ins.' + @PKCols + ' = ' + @TableName + '.' + @PKCols
    EXEC (@Sql)


    UPDATE Consultants1 SET DisplayName = 'abcd'
    where ConsIntID = 'Test123285'

Msg 4104, Level 16, State 1, Line 1
The multi-part identifier "#ins.ConsIntID" could not be bound.

共有1个答案

富昕
2023-03-14

您可以更改这行代码

SELECT @Sql = @Sql + ' WHERE #ins.' + @PKCols + ' = ' + @TableName + '.' + @PKCols

对此

SELECT @Sql = @Sql + ' FROM #ins a INNER JOIN ' + @TableName + ' b ON a.' + @PKCols + ' = b.' + @PKCols

另一种情况是,在更改之后,您可能会收到一个错误:Msg 570,Level 16,State 1,Line 1代替触发器不支持直接递归。触发器执行失败。

 类似资料:
  • 问题内容: 我的错误讯息: 多部分标识符table2.ValidSince“无法绑定。 我需要如何更改更新才能使其正常工作? 问题答案: 您需要加入

  • 问题内容: 试试这个 给出错误 不能绑定多部分标识符“ tblJobBudget.lastmodifiedby”。 问题答案: 这是因为没有任何带有标识符的表或表别名。 您的表是: 但不是: 如果需要表中的列,则应在表中包含一个子句:

  • 问题内容: 架构: 问题查询: 生成此架构并在SQL Server 2008下在SQLFiddle中运行查询将导致: 对子查询使用CROSS APPLY而不是INNER JOIN可以解决此问题 有什么问题? 编辑:我添加了“ TOP 1”,它是真正查询的一部分,并且是问题的相关部分。 Edit2:有关该问题的更多信息。 问题答案: 您不能将from子句引用到JOIN的另一部分。 改用它。 已编辑

  • 问题内容: 我有2张桌子: Table1 =加油站名称(成对) Table2 =具有坐标信息(经度和纬度等) 表1的 示例: 表 2的 示例: 我想使用位于中的坐标信息更新此表。我尝试根据SQL Server2005执行以下操作:无法绑定多部分标识符 我收到以下错误消息: 消息4104,级别16,状态1,第1行 无法绑定多部分标识符“ t1.Lattitude1”。 但是,如果执行以下操作,则可以

  • 问题内容: 我正在尝试使用MySQL触发器生成错误消息。下面是我的代码: 但这总是会产生错误。我不知道错误是什么,因为它没有说任何有关错误的信息,而只是“错误”。 有什么建议吗?除此之外,有人说使用存在问题,因为它可能取决于MySQL版本。有什么建议吗? 问题答案: 该子句是信号语法的一部分-它们之间不应存在分号()。此外,它使用运算符,而不是:

  • 我想创建ddl触发器(在创建),这将创建一个dml触发器,但我有错误: ORA-06512:8 00604. 00000-"错误发生在递归SQL级别%s"*原因:错误发生在处理递归SQL语句(适用于内部字典表的语句)。*操作:如果可以纠正堆栈上下一个错误中描述的情况,请这样做;否则请联系Oracle支持。