它返回一個原因是因爲你一個值(一些任意值)來分配。正如@Sive所建議的那樣,您應該使用EXISTS
而不是手動計數。原因是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
結果:
消息512,級別16,狀態1,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;
插入不會如果該行不存在,則會發生。
你有沒有嘗試過上述設置語句時有0,1和多個匹配的行? –