我正在寻找一种更有效的方法来完成这项任务。我需要设置一个等于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
然而,运行相同的查询两次似乎效率低下(检查是否存在以及是否设置了变量)
只是寻找有关更好地完成此任务的建议。
答案 0 :(得分:14)
尝试:
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
答案 1 :(得分:1)
试试这个:
INSERT INTO VariableTable (VariableID )
SELECT SCOPE_IDENTITY()
FROM VariableTable
WHERE not exists
(
SELECT VariableID FROM VariableTable WHERE VariableName = @VariableName
)
然后,如果您需要id,则必须将变量设置为@@ IDentity。我认为这是最有效的,因为你没有进行第三次查询,只是插入最后一个ID。
答案 2 :(得分:1)
我测试了这个代码段并且它正确执行:
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 :(得分:1)
这里是对@Mithrandir的修改。您可以使用TOP 1
来帮助您在不与唯一字段进行比较时加快结果。例如
DECLARE @EXISTS AS BIT
SET @EXISTS = 0
SELECT TOP 1 @EXISTS = 1 FROM MyTable WHERE MyYear = @Year
答案 4 :(得分:0)
尝试这个有趣的例外。请记住,没有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