Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何组合2个存储过程的结果并将数据组合到网格视图中_Sql_Sql Server_Stored Procedures - Fatal编程技术网

Sql 如何组合2个存储过程的结果并将数据组合到网格视图中

Sql 如何组合2个存储过程的结果并将数据组合到网格视图中,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我使用的是SQL Server,其中有两个存储过程: 第一个存储过程: CREATE PROCEDURE A AS SELECT DISTINCT TC.*, MS.* FROM VIEW1 TC, View2 MS WHERE TC.ID = MS.ID ORDER BY TC.Type ASC CREATE PROCEDURE B AS SET NOCOUN

我使用的是SQL Server,其中有两个存储过程:

第一个存储过程:

CREATE PROCEDURE A
AS
    SELECT DISTINCT 
        TC.*,       MS.*
    FROM
        VIEW1 TC,
        View2 MS
    WHERE
        TC.ID = MS.ID
    ORDER BY
        TC.Type ASC
CREATE PROCEDURE B
AS
    SET NOCOUNT ON

    SELECT DISTINCT
        TC.*, MS.*
    FROM
        VIEW3 TC,
        VIEW2 MS
    WHERE
        C.ID = MS.ID 
    ORDER BY 
        MS.Date DESC
第二存储过程:

CREATE PROCEDURE A
AS
    SELECT DISTINCT 
        TC.*,       MS.*
    FROM
        VIEW1 TC,
        View2 MS
    WHERE
        TC.ID = MS.ID
    ORDER BY
        TC.Type ASC
CREATE PROCEDURE B
AS
    SET NOCOUNT ON

    SELECT DISTINCT
        TC.*, MS.*
    FROM
        VIEW3 TC,
        VIEW2 MS
    WHERE
        C.ID = MS.ID 
    ORDER BY 
        MS.Date DESC
我想获得这两个存储过程的数据结果,然后将其绑定到gridview。我创建了以下存储过程,但它引发了一个错误,即ID列无效:

CREATED PROCEDURE C
AS
    SET NOCOUNT ON

    SELECT DISTINCT
        TC.*, MS.*
    FROM
        (VIEW1 TC
    LEFT JOIN 
        VIEW2 MS ON MS.ID = TC.ID)

    UNION 

    SELECT DISTINCT
        TC1.*, MS.*
    FROM
        (VIEW3 TC1
    LEFT JOIN
        VIEW2 MS on MS.ID = TC1.ID)

如何组合两个存储过程的数据结果?仅供参考,所有列都是从视图中选择的,而不是从表中选择的。

如果您不想重复代码,请创建一个结果表,如

CREATE PROCEDURE C
AS
    CREATE TABLE #foo (bar int ...)

     INSERT INTO #foo EXEC A
     INSERT INTO #foo EXEC B

     SELECT * FROM #foo
     DROP TABLE #foo
或者,如果列具有相似的数据类型,则只合并查询

CREATE PROCEDURE C
AS
    SELECT A.* FROM
    (
        SELECT DISTINCT 
            TC.*,       MS.*
        FROM
            VIEW1 TC,
            View2 MS
        WHERE
            TC.ID = MS.ID
        ORDER BY
            TC.Type ASC
    ) A
    UNION ALL
    SELECT B.* FROM
    (
        SELECT DISTINCT
            TC.*, MS.*
        FROM
            VIEW3 TC,
            VIEW2 MS
        WHERE
            C.ID = MS.ID 
        ORDER BY 
            MS.Date DESC
    ) B

在存储过程3中,使用括号是错误的,应该是这样的

CREATE PROCEDURE C
AS    
    SELECT DISTINCT
        TC.*, MS1.*
    FROM
        VIEW1 TC
    LEFT JOIN 
        VIEW2 MS1 ON MS1.ID = TC.ID

    UNION 

    SELECT DISTINCT
        TC2.*, MS2.*
    FROM
        VIEW3 TC2
    LEFT JOIN
        VIEW2 MS2 on MS2.ID = TC2.ID
您还可以将存储过程的结果插入临时表,然后显示临时表的结果:

CREATE TABLE #tempA(Column1 NVARCHAR(50),Column2 NVARCHAR(50),...)

INSERT INTO #tempA ( Column1, Column2, ... )
 EXEC A

INSERT INTO #tempA (Column1, Column2, ...)
 EXEC B

SELECT * FROM #tempA

是的,我知道,我查过了。删除MySQL和标记SQL Server如果您想使用UNION/UNION组合数据集,所有这些数据集必须具有相同的列数和数据类型(使用select*时这是危险的),然后UNION运算符将强制数据排序以删除重复的数据(不确定您是否计划了),因此请考虑UNION ALL