获取sql存储过程表类型中的错误
我有这个过程,我想在表中插入值列表,我想检查重复值并返回它,但我得到了这个错误 错误: 子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时获取sql存储过程表类型中的错误,sql,sql-server,Sql,Sql Server,我有这个过程,我想在表中插入值列表,我想检查重复值并返回它,但我得到了这个错误 错误: 子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时 ALTER PROCEDURE [dbo].[insertData] @Value insertTbl READONLY, @Result INT OUTPUT AS BEGIN BEGIN TRY IF (SELECT COUNT(Id) FROM @Values
ALTER PROCEDURE [dbo].[insertData]
@Value insertTbl READONLY,
@Result INT OUTPUT
AS
BEGIN
BEGIN TRY
IF (SELECT COUNT(Id)
FROM @Values
WHERE Id IN (SELECT Id
FROM [dbo].[username])) = 0
BEGIN
INSERT INTO dbo.username ( Id, NAME )
SELECT Id,
NAME
FROM @Values
WHERE Id NOT IN (SELECT Id
FROM [dbo].[username])
SELECT @Result = 101
END
ELSE
SELECT @Result = (
SELECT Id
FROM @Values
WHERE Id IN (SELECT Id
FROM [dbo].[username])
)
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE()
END CATCH
END
可能是这条线
SELECT @Result=(SELECT Id FROM @Values WHERE Id IN (SELECT Id FROM [dbo].[username]))
返回多行。您应该将查询更改为仅返回一个值,如下所示
SELECT @Result=(SELECT top 1 Id FROM @Values WHERE Id IN (SELECT Id FROM [dbo].[username]))
或者你应该改变你的逻辑。另一种方法是使用临时表返回ID的列表。请尝试下面的解决方案
-- create temporary table before (!) creating procedure
create table #Resulttab
(
Result int
)
go
ALTER PROCEDURE [dbo].[insertData]
@Value insertTbl READONLY,
@Result INT OUTPUT -- in this solution I think you don't need this parameter
AS
BEGIN
BEGIN TRY
IF (SELECT COUNT(Id)
FROM @Values
WHERE Id IN (SELECT Id
FROM [dbo].[username])) = 0
BEGIN
INSERT INTO dbo.username ( Id, NAME )
SELECT Id,
NAME
FROM @Values
WHERE Id NOT IN (SELECT Id
FROM [dbo].[username])
SELECT @Result = 101
END
ELSE
insert into #Resulttab
SELECT Id
FROM @Values
WHERE Id IN (SELECT Id
FROM [dbo].[username])
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE()
END CATCH
END
go
您可以这样使用它:
-- create temporary table before run procedure
create table #Resulttab
(
Result int
)
-- run procedure with parameters
exec insertData ...
--after run procedure you can check list of your IDs
select Result from #Resulttab
可能是这条线
SELECT @Result=(SELECT Id FROM @Values WHERE Id IN (SELECT Id FROM [dbo].[username]))
返回多行。您应该将查询更改为仅返回一个值,如下所示
SELECT @Result=(SELECT top 1 Id FROM @Values WHERE Id IN (SELECT Id FROM [dbo].[username]))
或者你应该改变你的逻辑。另一种方法是使用临时表返回ID的列表。请尝试下面的解决方案
-- create temporary table before (!) creating procedure
create table #Resulttab
(
Result int
)
go
ALTER PROCEDURE [dbo].[insertData]
@Value insertTbl READONLY,
@Result INT OUTPUT -- in this solution I think you don't need this parameter
AS
BEGIN
BEGIN TRY
IF (SELECT COUNT(Id)
FROM @Values
WHERE Id IN (SELECT Id
FROM [dbo].[username])) = 0
BEGIN
INSERT INTO dbo.username ( Id, NAME )
SELECT Id,
NAME
FROM @Values
WHERE Id NOT IN (SELECT Id
FROM [dbo].[username])
SELECT @Result = 101
END
ELSE
insert into #Resulttab
SELECT Id
FROM @Values
WHERE Id IN (SELECT Id
FROM [dbo].[username])
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE()
END CATCH
END
go
您可以这样使用它:
-- create temporary table before run procedure
create table #Resulttab
(
Result int
)
-- run procedure with parameters
exec insertData ...
--after run procedure you can check list of your IDs
select Result from #Resulttab
可能是这条线
SELECT @Result=(SELECT Id FROM @Values WHERE Id IN (SELECT Id FROM [dbo].[username]))
返回多行。您应该将查询更改为仅返回一个值,如下所示
SELECT @Result=(SELECT top 1 Id FROM @Values WHERE Id IN (SELECT Id FROM [dbo].[username]))
或者你应该改变你的逻辑。另一种方法是使用临时表返回ID的列表。请尝试下面的解决方案
-- create temporary table before (!) creating procedure
create table #Resulttab
(
Result int
)
go
ALTER PROCEDURE [dbo].[insertData]
@Value insertTbl READONLY,
@Result INT OUTPUT -- in this solution I think you don't need this parameter
AS
BEGIN
BEGIN TRY
IF (SELECT COUNT(Id)
FROM @Values
WHERE Id IN (SELECT Id
FROM [dbo].[username])) = 0
BEGIN
INSERT INTO dbo.username ( Id, NAME )
SELECT Id,
NAME
FROM @Values
WHERE Id NOT IN (SELECT Id
FROM [dbo].[username])
SELECT @Result = 101
END
ELSE
insert into #Resulttab
SELECT Id
FROM @Values
WHERE Id IN (SELECT Id
FROM [dbo].[username])
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE()
END CATCH
END
go
您可以这样使用它:
-- create temporary table before run procedure
create table #Resulttab
(
Result int
)
-- run procedure with parameters
exec insertData ...
--after run procedure you can check list of your IDs
select Result from #Resulttab
可能是这条线
SELECT @Result=(SELECT Id FROM @Values WHERE Id IN (SELECT Id FROM [dbo].[username]))
返回多行。您应该将查询更改为仅返回一个值,如下所示
SELECT @Result=(SELECT top 1 Id FROM @Values WHERE Id IN (SELECT Id FROM [dbo].[username]))
或者你应该改变你的逻辑。另一种方法是使用临时表返回ID的列表。请尝试下面的解决方案
-- create temporary table before (!) creating procedure
create table #Resulttab
(
Result int
)
go
ALTER PROCEDURE [dbo].[insertData]
@Value insertTbl READONLY,
@Result INT OUTPUT -- in this solution I think you don't need this parameter
AS
BEGIN
BEGIN TRY
IF (SELECT COUNT(Id)
FROM @Values
WHERE Id IN (SELECT Id
FROM [dbo].[username])) = 0
BEGIN
INSERT INTO dbo.username ( Id, NAME )
SELECT Id,
NAME
FROM @Values
WHERE Id NOT IN (SELECT Id
FROM [dbo].[username])
SELECT @Result = 101
END
ELSE
insert into #Resulttab
SELECT Id
FROM @Values
WHERE Id IN (SELECT Id
FROM [dbo].[username])
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE()
END CATCH
END
go
您可以这样使用它:
-- create temporary table before run procedure
create table #Resulttab
(
Result int
)
-- run procedure with parameters
exec insertData ...
--after run procedure you can check list of your IDs
select Result from #Resulttab
请试试这个
我已将返回类型更改为VARCHAR。将返回CSV(例如1,3,9…)
另一个选项是返回结果集。对于此替换,请选择@Result=以插入@Result…
希望这有帮助
ALTER PROCEDURE [dbo].[insertData]
@Value insertTbl READONLY,
@Result VARCHAR(500) OUTPUT
AS
BEGIN
BEGIN TRY
IF (SELECT COUNT(Id)
FROM @Values
WHERE Id IN (SELECT Id
FROM [dbo].[username])
) = 0
BEGIN
INSERT INTO dbo.username (Id,NAME)
SELECT Id,
NAME
FROM @Values
WHERE Id NOT IN (SELECT Id
FROM [dbo].[username])
SELECT @Result = 101
END
ELSE
BEGIN
SELECT @Result = (SELECT STUFF((SELECT ', ' + CAST(ID AS VARCHAR(5))
FROM @Values
WHERE Id IN (SELECT Id
FROM [dbo].[username])
ORDER BY Id FOR XML PATH('')),1,2,''))
END
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE()
END CATCH
END
请试试这个
我已将返回类型更改为VARCHAR。将返回CSV(例如1,3,9…)
另一个选项是返回结果集。对于此替换,请选择@Result=以插入@Result…
希望这有帮助
ALTER PROCEDURE [dbo].[insertData]
@Value insertTbl READONLY,
@Result VARCHAR(500) OUTPUT
AS
BEGIN
BEGIN TRY
IF (SELECT COUNT(Id)
FROM @Values
WHERE Id IN (SELECT Id
FROM [dbo].[username])
) = 0
BEGIN
INSERT INTO dbo.username (Id,NAME)
SELECT Id,
NAME
FROM @Values
WHERE Id NOT IN (SELECT Id
FROM [dbo].[username])
SELECT @Result = 101
END
ELSE
BEGIN
SELECT @Result = (SELECT STUFF((SELECT ', ' + CAST(ID AS VARCHAR(5))
FROM @Values
WHERE Id IN (SELECT Id
FROM [dbo].[username])
ORDER BY Id FOR XML PATH('')),1,2,''))
END
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE()
END CATCH
END
请试试这个
我已将返回类型更改为VARCHAR。将返回CSV(例如1,3,9…)
另一个选项是返回结果集。对于此替换,请选择@Result=以插入@Result…
希望这有帮助
ALTER PROCEDURE [dbo].[insertData]
@Value insertTbl READONLY,
@Result VARCHAR(500) OUTPUT
AS
BEGIN
BEGIN TRY
IF (SELECT COUNT(Id)
FROM @Values
WHERE Id IN (SELECT Id
FROM [dbo].[username])
) = 0
BEGIN
INSERT INTO dbo.username (Id,NAME)
SELECT Id,
NAME
FROM @Values
WHERE Id NOT IN (SELECT Id
FROM [dbo].[username])
SELECT @Result = 101
END
ELSE
BEGIN
SELECT @Result = (SELECT STUFF((SELECT ', ' + CAST(ID AS VARCHAR(5))
FROM @Values
WHERE Id IN (SELECT Id
FROM [dbo].[username])
ORDER BY Id FOR XML PATH('')),1,2,''))
END
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE()
END CATCH
END
请试试这个
我已将返回类型更改为VARCHAR。将返回CSV(例如1,3,9…)
另一个选项是返回结果集。对于此替换,请选择@Result=以插入@Result…
希望这有帮助
ALTER PROCEDURE [dbo].[insertData]
@Value insertTbl READONLY,
@Result VARCHAR(500) OUTPUT
AS
BEGIN
BEGIN TRY
IF (SELECT COUNT(Id)
FROM @Values
WHERE Id IN (SELECT Id
FROM [dbo].[username])
) = 0
BEGIN
INSERT INTO dbo.username (Id,NAME)
SELECT Id,
NAME
FROM @Values
WHERE Id NOT IN (SELECT Id
FROM [dbo].[username])
SELECT @Result = 101
END
ELSE
BEGIN
SELECT @Result = (SELECT STUFF((SELECT ', ' + CAST(ID AS VARCHAR(5))
FROM @Values
WHERE Id IN (SELECT Id
FROM [dbo].[username])
ORDER BY Id FOR XML PATH('')),1,2,''))
END
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE()
END CATCH
END
这是你的答案,但我想把所有的答案都重复一遍value@user3807529你不能,因为<代码> @结果<代码>是代码> int <代码>类型,而不是<代码>数组>代码> @ USE380729。我增加了一个返回IDAM列表的TAMORALLE表的解决方案。请考虑新的解决方案。但我想把所有的都重新放一遍value@user3807529你不能,因为<代码> @结果<代码>是代码> int <代码>类型,而不是<代码>数组>代码> @ USE380729。我增加了一个返回IDAM列表的TAMORALLE表的解决方案。请考虑新的解决方案。但我想把所有的都重新放一遍value@user3807529你不能,因为<代码> @结果<代码>是代码> int <代码>类型,而不是<代码>数组>代码> @ USE380729。我增加了一个返回IDAM列表的TAMORALLE表的解决方案。请考虑新的解决方案。但我想把所有的都重新放一遍value@user3807529你不能,因为<代码> @结果< /代码>是代码> int <代码>类型,而不是<代码>数组>代码> @ USE380729。我增加了一个返回IDAM列表的TAMORALURE表的解决方案。请考虑新的解决方案。