【问题标题】:SQL Server Set variable if exists else insert into tableSQL Server 如果存在则设置变量,否则插入表中
【发布时间】:2012-02-23 12:07:26
【问题描述】:

我正在寻找一种更有效的方式来完成这项任务。如果存在,我需要设置一个等于 ID 的变量,如果不存在则插入它,然后将变量设置为插入的标识。我可以通过执行以下操作来完成此操作:

@VariableName --sent through to stored procedure

DECLARE @VariableID [int]

IF EXISTS(SELECT VariableID FROM VariableTable WHERE VariableName = @VariableName)
    SET @VariableID = (SELECT VariableID FROM VariableTable WHERE VariableName = @VariableName)
ELSE 
    INSERT INTO VariableTable(VariableName) VALUES(@VariableName)
    SET @VariableID = SCOPE_IDENTITY();
END

但是两次运行相同的查询似乎效率低下(检查是否存在以及是否设置了变量)

只是寻找有关完成此任务的更好方法的建议。

【问题讨论】:

    标签: sql-server-2008 stored-procedures exists


    【解决方案1】:

    试试:

    DECLARE @VariableID [int]
    SELECT @VariableID=VariableID FROM VariableTable WHERE VariableName = @VariableName
    
    IF @VariableID IS NULL
    BEGIN
        INSERT INTO VariableTable(VariableName) VALUES(@VariableName)
        SET @VariableID = SCOPE_IDENTITY();
    END
    

    【讨论】:

      【解决方案2】:

      我测试了这个sn-p,它执行正确:

      DECLARE @VariableID [int]
      SET @VariableID=(SELECT VariableID FROM VariableTable WHERE VariableName = @VariableName)
      IF @VariableID IS NULL
      BEGIN
        INSERT INTO VariableTable(VariableName) VALUES(@VariableName)
        SET @VariableID = SCOPE_IDENTITY();
      END
      

      【讨论】:

        【解决方案3】:

        这里是对@Mithrandir 答案的精简修改。您可以使用TOP 1 在不与唯一字段进行比较时帮助您加快结果。例如

        DECLARE @EXISTS AS BIT
        SET @EXISTS = 0
        SELECT TOP 1 @EXISTS = 1 FROM MyTable WHERE MyYear = @Year
        

        【讨论】:

          【解决方案4】:

          试试这个:

          INSERT INTO VariableTable (VariableID )
           SELECT SCOPE_IDENTITY()
          FROM VariableTable
          WHERE not exists
          (
           SELECT VariableID FROM VariableTable WHERE VariableName = @VariableName
          )
          

          然后,如果您需要 id,则必须将变量设置为 @@IDentity。我认为这是最有效的,因为您不需要进行第三次查询,而只是插入最后一个 ID。

          【讨论】:

            【解决方案5】:

            试试这个有趣的例外。请记住,没有 BEGIN 和 END,因此 IF 之后的下一条语句应该是有条件的。现在问问自己为什么第一个变量存在:

            declare @check binary
            declare @predeclared varchar(100)
            select @check = 0
            
            if @check = 1
               declare @conditionaldeclare nvarchar(4000)
               select @conditionaldeclare = 'conditionaldeclare'
               print @conditionaldeclare
            
            
            if @check = 1
               select @predeclared = 'predeclared'
               print @predeclared
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-03-02
              • 1970-01-01
              • 1970-01-01
              • 2014-10-23
              • 2015-08-14
              • 2018-10-12
              相关资源
              最近更新 更多