2017-04-13 78 views
0

我写了下面的脚本:如何避免“子查询返回超过1个值”报告?

IF OBJECT_ID('tempdb..#Temp') IS NOT NULL 
DROP TABLE #Temp 
create table #Temp 
(
     [KeyName] [nvarchar](max), 
     [CertName] [nvarchar](max), 
) 
Go 


INSERT INTO #Temp 
EXEC fetch_data 

GO 

IF(Select #Temp.KeyName From #Temp) = 'SSN_Key_01' AND (Select CertName From 
#Temp) = 'PasswordManager001' 
EXEC decrypt_1 

Else 

IF(Select KeyName From #Temp) = 'SSN_Key_02' AND (Select CertName From #Temp) 
= 'PasswordManager002' 
EXEC decrypt_2 

Else 

IF(Select KeyName From #Temp) = 'SSN_Key_03' AND (Select CertName From #Temp) 
= 'PasswordManager003' 
EXEC decrypt_3 

GO 

,并不断得到错误:子查询返回多个值。当子查询遵循=,!=,<,< =,>,> =或当子查询用作表达式时,这是不允许的。

我只是试着对我的返回值做一点比较,并根据脚本中可见的三个条件执行它们。

为什么我不断收到报告?

+3

因为选择返回多于1行,mybe要使用'IF EXISTS' – Sami

+0

运行fetch_data存储过程并查看它返回的内容。或者,独立运行这些子查询并查看结果。 –

回答

0

解决它试试这个:

IF exists (Select #Temp.KeyName From #Temp where KeyName = 'SSN_Key_01') 
begin 
if exists (Select CertName From 
#Temp where CertName = 'PasswordManager001') 
EXEC decrypt_1 
end 
Else 

IF exists(Select KeyName From #Temp where KeyName = 'SSN_Key_02') 
begin 
if exists (Select CertName From #Temp where CertName 
= 'PasswordManager002') 

EXEC decrypt_2 
end 

Else 

IF exists (Select KeyName From #Temp where KeyName = 'SSN_Key_03') 
begin 
if exists (Select CertName From #Temp where CertName 
= 'PasswordManager003') 
EXEC decrypt_3 

end 
0

似乎您的#Temp表中有多个CertName和/或多个KeyName

如果有重复不止一次一个值,你可以用一个distinct

IF(Select distinct KeyName From #Temp) ... 

如果您有多个不同的价值观解决这个问题,你或许可以用

IF (Select count(*) From #Temp where KeyName = 'SSN_Key_01') > 0 ... 
相关问题