获取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表的解决方案。请考虑新的解决方案。