我的代码如下:
SET @var = (SELECT var FROM dbo.varDB WHERE varName = @varName)
IF (@@ROWCOUNT > 0)
BEGIN
//carry out insert
END
我是否正确地说,这将始终为 @@ ROWCOUNT 返回 1 ,因为它最后执行了一项任务?
如果是这样,那么最优雅的解决方案是什么:
答案 0 :(得分:9)
它返回一个的原因是你只分配了一个值(某个任意值)。你应该使用EXISTS
而不是手动计数,正如@Sive建议的那样。原因是EXISTS的性能不会低于COUNT,并且在您描述的用例中,无论如何实际计数并不重要。您想知道计数是零还是大于零。
如果有多个行匹配,那么以你完成它的方式将值赋给变量的问题是什么?我们来试试吧:
DECLARE @foo TABLE([var] INT, varname SYSNAME);
INSERT @foo VALUES (1,N'bob'),(2,N'bob');
DECLARE @var INT;
SET @var = (SELECT [var] FROM @foo WHERE varname = N'bob
结果:
Msg 512,Level 16,State 1,Line 4
子查询返回超过1 值。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。
现在,如果varname
是唯一的,我会这样做:
SELECT @var = [var] FROM dbo.varDB WHERE varName = @varName;
IF @var IS NOT NULL
BEGIN
// carry out insert
END
ELSE
BEGIN
PRINT 'Already existed! ' + RTRIM(@var);
END
如果varname
不唯一,那么我不确定您要对单个值做什么。它拉了哪一个?想象一下这种情况:
DECLARE @foo TABLE([var] INT, varname SYSNAME);
INSERT @foo VALUES (3,N'bob'),(2,N'adam'),(1,N'bob');
DECLARE @var INT;
SELECT @var = [var] FROM @foo WHERE varname = N'bob';
PRINT @var;
@var
会是1还是3?谁知道?如果您只捕获潜在的多个值之一,为什么它是重要的?你打算用那一行做些什么而不是其他的吗?
此外,如果您打算从此表中插入数据,为什么不简单地抛弃前期检查,行数等,然后说:
INSERT dbo.SomeTable(column1 --,...other columns
SELECT var --,...other columns
FROM dbo.varDB
WHERE varName = @varName;
如果行不存在,则不会发生插入。
答案 1 :(得分:5)
您可以使用EXISTS
执行此类操作。这将在执行 BEGIN 和 END 之间的语句之前检查@varName
中是否存在给定值的至少一条记录。
脚本:
IF EXISTS (SELECT var FROM dbo.varDB WHERE varName = @varName)
BEGIN
//carry out insert
END
MSDN文档:EXISTS (Transact-SQL)
我不明白了解价值的要求。我想你可能想要使用COUNT,如果你想要获取计数。
DECLARE @recordsCount
SELECT @recordsCount = COUNT(var) FROM dbo.varDB WHERE varName = @varName
IF recordsCount > 0
BEGIN
// your statements
END
如果您想在BEGIN和END中使用结果集本身,那么问题需要有关如何在语句中使用结果集的更多详细信息。根据进一步的输入,您可能甚至不需要IF声明。需要进一步的细节来为您的问题提供明确的解决方案。
答案 2 :(得分:5)
您可以将变量设置为NULL
(只是为了确定)。
如果您的查询没有返回任何行,@ var仍然是NULL
如果它返回一行,@var
将具有值
如果它返回多行,你将有一个例外。
SET @var = NULL
SET @var = (SELECT var FROM dbo.varDB WHERE varName = @varName)
IF @var IS NOT NULL
BEGIN
//carry out insert
END
<强>更新强>
如果您确实想要使用@@ROWCOUNT
,则可以使用select
代替set
来分配您的值。
SELECT @var = var FROM dbo.varDB WHERE varName = @varName
IF (@@ROWCOUNT > 0)
BEGIN
//carry out insert
END
答案 3 :(得分:4)
您可以选择并测试返回的行数:
SELECT @var = var FROM dbo.varDB WHERE varName = @varName
IF (@@ROWCOUNT > 0)
BEGIN
//carry out insert
END