Sql Server 存储过程中查询数据无法使用 Union(All)

原文:Sql Server 存储过程中查询数据无法使用 Union(All)

  微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询。

    1、先看一段正常的SQL语句,使用了Union(All)查询:

    

SELECT ci.CustId --客户编号
       ,
       ci.CustNam --客户名称
       ,
       ci.ContactBy --联系人
       ,
       ci.Conacts --联系电话
       ,
       ci.Addr -- 联系地址
       ,
       ci.Notes --备注信息
       ,
       ai2.AreaNam --区域名称,省份名称
       ,
       ISNULL(cc.CType, '')       AS CType--合同类型
       ,
       ISNULL(caat.ArTotal, 0.0)  AS ArTotal --截止到当月底,云想系统账欠款余额
FROM   CustInfo                   AS ci
       INNER  JOIN AreaInfo       AS ai
            ON  ci.AreaCode = ai.AreaCode
       INNER JOIN AreaInfo        AS ai2
            ON  ai.PareaCode = ai2.AreaCode
       LEFT JOIN CustContract     AS cc
            ON  cc.CustId = ci.CustId
       LEFT JOIN CustArApTotal    AS caat
            ON  ci.CustId = caat.CustId
WHERE  ci.CustCatagory = 1

UNION ALL 

SELECT ci.CustId --客户编号
       ,
       ci.CustNam --客户名称
       ,
       ci.ContactBy --联系人
       ,
       ci.Conacts --联系电话
       ,
       ci.Addr -- 联系地址
       ,
       ci.Notes --备注信息
       ,
       ai2.AreaNam --区域名称,省份名称
       ,
       ISNULL(cc.CType, '')     AS CType--合同类型
       ,
       ISNULL(caat.ArTotal, 0)  AS ArTotal --截止到当月底,云想系统账欠款余额
FROM   CustInfo                 AS ci
       INNER  JOIN AreaInfo     AS ai
            ON  ci.AreaCode = ai.AreaCode
       INNER JOIN AreaInfo      AS ai2
            ON  ai.PareaCode = ai2.AreaCode
       INNER JOIN CustContract  AS cc
            ON  cc.CustId = ci.CustId
       LEFT JOIN CustArApTotal  AS caat
            ON  ci.CustId = caat.CustId
WHERE  ci.CustCatagory = 2

View Code

 

 运行结果:查询出441条数据,其中Union(all) 之前的sql语句查询结果为101条记录;

              Union(all) 之后的sql语句查询结果为330条记录。

 

2、创建视图,将以上SQL查询语句放在视图中:

 1 ALTER VIEW [dbo].[VGetCustRelatedInfo2]
 2 AS
 3
 4 SELECT ci.CustId --客户编号
 5        ,
 6        ci.CustNam --客户名称
 7        ,
 8        ci.ContactBy --联系人
 9        ,
10        ci.Conacts --联系电话
11        ,
12        ci.Addr -- 联系地址
13        ,
14        ci.Notes --备注信息
15        ,
16        ai2.AreaNam --区域名称,省份名称
17        ,
18        ISNULL(cc.CType, '')       AS CType--合同类型
19        ,
20        ISNULL(caat.ArTotal, 0.0)  AS ArTotal --截止到当月底,云想系统账欠款余额
21 FROM   CustInfo                   AS ci
22        INNER  JOIN AreaInfo       AS ai
23             ON  ci.AreaCode = ai.AreaCode
24        INNER JOIN AreaInfo        AS ai2
25             ON  ai.PareaCode = ai2.AreaCode
26        LEFT JOIN CustContract     AS cc
27             ON  cc.CustId = ci.CustId
28        LEFT JOIN CustArApTotal    AS caat
29             ON  ci.CustId = caat.CustId
30 WHERE  ci.CustCatagory = 1
31
32                        UNION ALL
33
34 SELECT ci.CustId --客户编号
35        ,
36        ci.CustNam --客户名称
37        ,
38        ci.ContactBy --联系人
39        ,
40        ci.Conacts --联系电话
41        ,
42        ci.Addr -- 联系地址
43        ,
44        ci.Notes --备注信息
45        ,
46        ai2.AreaNam --区域名称,省份名称
47        ,
48        ISNULL(cc.CType, '')     AS CType--合同类型
49        ,
50        ISNULL(caat.ArTotal, 0)  AS ArTotal --截止到当月底,云想系统账欠款余额
51 FROM   CustInfo                 AS ci
52        INNER  JOIN AreaInfo     AS ai
53             ON  ci.AreaCode = ai.AreaCode
54        INNER JOIN AreaInfo      AS ai2
55             ON  ai.PareaCode = ai2.AreaCode
56        INNER JOIN CustContract  AS cc
57             ON  cc.CustId = ci.CustId
58        LEFT JOIN CustArApTotal  AS caat
59             ON  ci.CustId = caat.CustId
60 WHERE  ci.CustCatagory = 2
61
62
63
64
65
66 GO

View Code

调用视图,运行结果:查询出441条数据,其中Union(all) 之前的sql语句查询结果为101条记录;

              Union(all) 之后的sql语句查询结果为330条记录。

 

   3、创建存储过程,代码如下:

 

  1 /************************************************************
  2  * Code formatted by SoftTree SQL Assistant ?v6.5.258
  3  * Time: 2014/9/12 16:41:46
  4  ************************************************************/
  5
  6 GO
  7
  8 /****** Object:  StoredProcedure [dbo].[SP_GetCustRelatedInfo2]    Script Date: 09/12/2014
  9
 10 15:48:17 ******/
 11 SET ANSI_NULLS ON
 12 GO
 13
 14 SET QUOTED_IDENTIFIER ON
 15 GO
 16
 17
 18
 19 -- =============================================
 20 -- Author:      XXX
 21 -- Create date: XXX
 22 -- Description: XXX
 23 -- =============================================
 24 ALTER PROCEDURE [dbo].[SP_GetCustRelatedInfo2]
 25     @custId NVARCHAR(30) --客户编号
 26      ,
 27     @custNam NVARCHAR(1000) --客户名称
 28      ,
 29     @areaNam NVARCHAR(30)--区域、省份名称
 30      ,
 31     @pageSize INT --单页记录条数
 32      ,
 33     @pageIndex INT --当前页左索引
 34      ,
 35     @totalRowCount INT OUTPUT --输出总记录条数
 36 AS
 37 BEGIN
 38     SET NOCOUNT ON;
 39
 40     DECLARE @RowStart INT; --定义分页起始位置
 41     DECLARE @RowEnd INT; --定义分页结束位置
 42
 43     DECLARE @Sql NVARCHAR(MAX); --拼接SQL语句
 44     DECLARE @SqlSelectResult NVARCHAR(MAX); --Sql查询结果语句
 45     DECLARE @SqlCount NVARCHAR(MAX); --Sql Count计数语句
 46
 47     IF @pageIndex > 0
 48     BEGIN
 49         SET @pageIndex = @pageIndex -1;
 50         SET @RowStart = @pageSize * @pageIndex + 1;
 51         SET @RowEnd = @RowStart + @pageSize - 1;
 52     END
 53     ELSE
 54     BEGIN
 55         SET @RowStart = 1;
 56         SET @RowEnd = 999999;
 57     END
 58
 59     IF ISNULL(@pageSize, 0) <> 0
 60     BEGIN
 61         SET @sql =
 62             'With CTE_CustRelatedInfo as (
 63                 SELECT  ROW_NUMBER () OVER (ORDER BY t.CustId ASC)  AS RowNumber, t.*
 64              FROM   (
 65                  SELECT ci.CustId --客户编号
 66                ,
 67                ci.CustNam --客户名称
 68                ,
 69                ci.ContactBy --联系人
 70                ,
 71                ci.Conacts --联系电话
 72                ,
 73                ci.Addr -- 联系地址
 74                ,
 75                ci.Notes --备注信息
 76                ,
 77                ai2.AreaNam --区域名称,省份名称
 78                ,
 79                ISNULL(cc.CType, '')       AS CType--合同类型
 80                ,
 81                ISNULL(caat.ArTotal, 0.0)  AS ArTotal --截止到当月底,云想系统账欠款余额
 82         FROM   CustInfo                   AS ci
 83                INNER  JOIN AreaInfo       AS ai
 84                     ON  ci.AreaCode = ai.AreaCode
 85                INNER JOIN AreaInfo        AS ai2
 86                     ON  ai.PareaCode = ai2.AreaCode
 87                LEFT JOIN CustContract     AS cc
 88                     ON  cc.CustId = ci.CustId
 89                LEFT JOIN CustArApTotal    AS caat
 90                     ON  ci.CustId = caat.CustId
 91         WHERE  ci.CustCatagory = 1
 92
 93     UNION ALL
 94
 95         SELECT ci.CustId --客户编号
 96                ,
 97                ci.CustNam --客户名称
 98                ,
 99                ci.ContactBy --联系人
100                ,
101                ci.Conacts --联系电话
102                ,
103                ci.Addr -- 联系地址
104                ,
105                ci.Notes --备注信息
106                ,
107                ai2.AreaNam --区域名称,省份名称
108                ,
109                ISNULL(cc.CType, '')     AS CType--合同类型
110                ,
111                ISNULL(caat.ArTotal, 0)  AS ArTotal --截止到当月底,云想系统账欠款余额
112         FROM   CustInfo                 AS ci
113                INNER  JOIN AreaInfo     AS ai
114                     ON  ci.AreaCode = ai.AreaCode
115                INNER JOIN AreaInfo      AS ai2
116                     ON  ai.PareaCode = ai2.AreaCode
117                INNER JOIN CustContract  AS cc
118                     ON  cc.CustId = ci.CustId
119                LEFT JOIN CustArApTotal  AS caat
120                     ON  ci.CustId = caat.CustId
121         WHERE  ci.CustCatagory = 2
122                  )
123               AS t
124                 WHERE 1=1 ';--此处CTE表达式右括号不写,在后面根据条件判断,追加
125     END
126     ELSE
127     BEGIN
128         SET @sql =
129             'SELECT t.*
130              FROM  (
131              SELECT ci.CustId --客户编号
132                ,ci.CustNam --客户名称
133                ,
134                ci.ContactBy --联系人
135                ,
136                ci.Conacts --联系电话
137                ,
138                ci.Addr -- 联系地址
139                ,
140                ci.Notes --备注信息
141                ,
142                ai2.AreaNam --区域名称,省份名称
143                ,
144                ISNULL(cc.CType, '')       AS CType--合同类型
145                ,
146                ISNULL(caat.ArTotal, 0.0)  AS ArTotal --截止到当月底,云想系统账欠款余额
147         FROM   CustInfo                   AS ci
148                INNER  JOIN AreaInfo       AS ai
149                     ON  ci.AreaCode = ai.AreaCode
150                INNER JOIN AreaInfo        AS ai2
151                     ON  ai.PareaCode = ai2.AreaCode
152                LEFT JOIN CustContract     AS cc
153                     ON  cc.CustId = ci.CustId
154                LEFT JOIN CustArApTotal    AS caat
155                     ON  ci.CustId = caat.CustId
156         WHERE  ci.CustCatagory = 1
157
158         UNION ALL
159
160         SELECT ci.CustId --客户编号
161                ,
162                ci.CustNam --客户名称
163                ,
164                ci.ContactBy --联系人
165                ,
166                ci.Conacts --联系电话
167                ,
168                ci.Addr -- 联系地址
169                ,
170                ci.Notes --备注信息
171                ,
172                ai2.AreaNam --区域名称,省份名称
173                ,
174                ISNULL(cc.CType, '')     AS CType--合同类型
175                ,
176                ISNULL(caat.ArTotal, 0)  AS ArTotal --截止到当月底,云想系统账欠款余额
177         FROM   CustInfo                 AS ci
178                INNER  JOIN AreaInfo     AS ai
179                     ON  ci.AreaCode = ai.AreaCode
180                INNER JOIN AreaInfo      AS ai2
181                     ON  ai.PareaCode = ai2.AreaCode
182                INNER JOIN CustContract  AS cc
183                     ON  cc.CustId = ci.CustId
184                LEFT JOIN CustArApTotal  AS caat
185                     ON  ci.CustId = caat.CustId
186         WHERE  ci.CustCatagory = 2
187                  )
188               AS t
189              WHERE 1=1 ';
190     END
191
192     IF ISNULL(@custId, '') <> ''
193     BEGIN
194         --根据客户id查询
195         SET @Sql = @Sql + ' AND t.CustId like ''%' + @custId + '%''';
196     END
197
198     IF ISNULL(@custNam, '') <> ''
199     BEGIN
200         --根据客户名称 模糊查询
201         SET @Sql = @Sql + ' AND t.CustNam like ''%' + @custNam + '%''';
202     END
203
204     IF ISNULL(@areaNam, '') <> ''
205     BEGIN
206         --根据区域、省份名称
207         SET @Sql = @Sql + ' AND t.AreaNam like ''%' + @areaNam + '%''';
208     END
209
210     IF ISNULL(@pageSize, 0) <> 0
211     BEGIN
212         SET @Sql = @Sql + ') ';
213
214         SET @SqlCount = @Sql +
215             ' SELECT @Temp = COUNT(*) FROM CTE_CustRelatedInfo;';
216
217         SET @SqlSelectResult = @Sql +
218             ' SELECT * FROM CTE_CustRelatedInfo
219               WHERE RowNumber Between ' + CONVERT(VARCHAR(10), @RowStart)
220             +
221             ' And ' + CONVERT(VARCHAR(10), @RowEnd) + ';';
222
223         PRINT (@SqlSelectResult);--打印输出sql语句
224
225         EXEC sp_executesql @SqlSelectResult;--执行sql查询
226
227         EXEC sp_executesql @SqlCount,
228              N'@Temp int output',
229              @totalRowCount OUTPUT ; --执行count统计
230     END
231     ELSE
232     BEGIN
233         SET @Sql = @sql + ' order by t.CustId ASC ';
234         SET @totalRowCount = 0; --总记录数
235         PRINT (@Sql);--打印输出sql语句
236         EXEC (@Sql);----打印输出sql语句
237     END
238
239     SET NOCOUNT OFF;
240 END
241 GO

View Code

  调用存储过程 :

  DECLARE @totalRowCount INT
  EXEC SP_GetCustRelatedInfo2 '','','',10000,1,@totalRowCount OUT

     运行结果:查询出330条记录。

     以上结果说明:Sql Server 存储过程中查询语句无法直接使用 Union(All)。使用之后,程序不报错,但是查询结果会丢失Union(All)之前的所有查询记录,只保留最后一个Union(All)之后查询语句的查询结果记录。

     解决方法:

    方案1:先创建视图,将使用Union(All)关键字的sql查询语句放在视图中,然后再存储过程中调用视图。如下:

  1 USE [BPMIS_TEST]
  2 GO
  3
  4 /****** Object:  StoredProcedure [dbo].[SP_GetCustRelatedInfo2]    Script Date: 09/12/2014 15:48:17 ******/
  5 SET ANSI_NULLS ON
  6 GO
  7
  8 SET QUOTED_IDENTIFIER ON
  9 GO
 10
 11
 12
 13 -- =============================================
 14 -- Author:        张传宁
 15 -- Create date: 2014-9-11
 16 -- Description:    获取对账单评估明细表信息列表
 17 -- =============================================
 18 ALTER PROCEDURE [dbo].[SP_GetCustRelatedInfo2]
 19     @custId NVARCHAR(30) --客户编号
 20      ,
 21     @custNam NVARCHAR(1000) --客户名称
 22      ,
 23     @areaNam NVARCHAR(30)--区域、省份名称
 24      ,
 25     @pageSize INT --单页记录条数
 26      ,
 27     @pageIndex INT --当前页左索引
 28      ,
 29     @totalRowCount INT OUTPUT --输出总记录条数
 30 AS
 31 BEGIN
 32     SET NOCOUNT ON;
 33
 34     DECLARE @RowStart INT; --定义分页起始位置
 35     DECLARE @RowEnd INT; --定义分页结束位置
 36
 37     DECLARE @Sql NVARCHAR(MAX); --拼接SQL语句
 38     DECLARE @SqlSelectResult NVARCHAR(MAX); --Sql查询结果语句
 39     DECLARE @SqlCount NVARCHAR(MAX); --Sql Count计数语句
 40
 41     IF @pageIndex > 0
 42     BEGIN
 43         SET @pageIndex = @pageIndex -1;
 44         SET @RowStart = @pageSize * @pageIndex + 1;
 45         SET @RowEnd = @RowStart + @pageSize - 1;
 46     END
 47     ELSE
 48     BEGIN
 49         SET @RowStart = 1;
 50         SET @RowEnd = 999999;
 51     END
 52
 53     IF ISNULL(@pageSize, 0) <> 0
 54     BEGIN
 55         SET @sql =
 56             'With CTE_CustRelatedInfo as (
 57                 SELECT  ROW_NUMBER () OVER (ORDER BY t.CustId ASC)  AS RowNumber, t.*
 58              FROM   VGetCustRelatedInfo2 AS t
 59                 WHERE 1=1 ';--此处CTE表达式右括号不写,在后面根据条件判断,追加
 60     END
 61     ELSE
 62     BEGIN
 63         SET @sql =
 64             'SELECT t.*
 65              FROM  VGetCustRelatedInfo2 AS t
 66              WHERE 1=1 ';
 67     END
 68
 69     IF ISNULL(@custId, '') <> ''
 70     BEGIN
 71         --根据客户id查询
 72         SET @Sql = @Sql + ' AND t.CustId like ''%' + @custId + '%''';
 73     END
 74
 75     IF ISNULL(@custNam, '') <> ''
 76     BEGIN
 77         --根据客户名称 模糊查询
 78         SET @Sql = @Sql + ' AND t.CustNam like ''%' + @custNam + '%''';
 79     END
 80
 81     IF ISNULL(@areaNam, '') <> ''
 82     BEGIN
 83         --根据区域、省份名称
 84         SET @Sql = @Sql + ' AND t.AreaNam like ''%' + @areaNam + '%''';
 85     END
 86
 87     IF ISNULL(@pageSize, 0) <> 0
 88     BEGIN
 89         SET @Sql = @Sql + ') ';
 90
 91         SET @SqlCount = @Sql +
 92             ' SELECT @Temp = COUNT(*) FROM CTE_CustRelatedInfo;';
 93
 94         SET @SqlSelectResult = @Sql +
 95             ' SELECT * FROM CTE_CustRelatedInfo
 96               WHERE RowNumber Between ' + CONVERT(VARCHAR(10), @RowStart)
 97             +
 98             ' And ' + CONVERT(VARCHAR(10), @RowEnd) + ';';
 99
100         PRINT (@SqlSelectResult);--打印输出sql语句
101
102         EXEC sp_executesql @SqlSelectResult;--执行sql查询
103
104         EXEC sp_executesql @SqlCount,
105              N'@Temp int output',
106              @totalRowCount OUTPUT ; --执行count统计
107     END
108     ELSE
109     BEGIN
110         SET @Sql = @sql + ' order by t.CustId ASC ';
111         SET @totalRowCount = 0; --总记录数
112         PRINT (@Sql);--打印输出sql语句
113         EXEC (@Sql);----打印输出sql语句
114     END
115
116     SET NOCOUNT OFF;
117 END
118
119
120
121 GO

View Code

     方案2:在存储过程中先创建临时表,将多个Union(All)前后的sql查询语句的查询结果插入到临时表中,然后操作临时表,最后做其他的处理。

时间: 2024-10-29 01:11:01

Sql Server 存储过程中查询数据无法使用 Union(All)的相关文章

Sql server存储过程中常见游标循环用法

原文:Sql server存储过程中常见游标循环用法 用游标,和WHILE可以遍历您的查询中的每一条记录并将要求的字段传给变量进行相应的处理 DECLARE @A1 VARCHAR(10), @A2 VARCHAR(10), @A3 INT DECLARE YOUCURNAME CURSOR FOR SELECT A1,A2,A3 FROM YOUTABLENAME OPEN YOUCURNAME fetch next from youcurname into @a1,@a2,@a3 while

SQL Server 存储过程名称查询

  SQL Server存储过程名称查询 Select OBJECT_NAME(id) FROM syscomments Where [text] LIKE '%table_name%' AND OBJECTPROPERTY(id, 'IsProcedure') = 1 GROUP BY OBJECT_NAME(id) 所有使用表名

SQL Server存储过程中编写事务处理的方法小结_MsSql

本文实例讲述了SQL Server存储过程中编写事务处理的方法.分享给大家供大家参考,具体如下: SQL Server中数据库事务处理是相当有用的,鉴于很多SQL初学者编写的事务处理代码存往往存在漏洞,本文我们介绍了三种不同的方法,举例说明了如何在存储过程事务处理中编写正确的代码.希望能够对您有所帮助. 在编写SQL Server 事务相关的存储过程代码时,经常看到下面这样的写法: begin tran update statement 1 ... update statement 2 ...

C#同步SQL Server数据库中的数据--数据库同步工具[同步已有的有变化的数据]

C#同步SQL Server数据库中的数据--数据库同步工具[同步已有的有变化的数据] 1. C#同步SQL Server数据库Schema 2. C#同步SQL Server数据库中的数据--数据库同步工具[同步新数据] 3. 分析下自己写的SQL Server同步工具的性能和缺陷 接着写数据同步,这次可以把有变化的数据进行更新了: 1.SQL批量更新函数: /// <summary> /// Note: for columns, the first string must be prima

C#同步SQL Server数据库中的数据--数据库同步工具[同步新数据]

C#同步SQL Server数据库中的数据 1. 先写个sql处理类: using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Text; namespace PinkDatabaseSync { class DBUtility : IDisposable { private string Server; private string

SQL Server存储过程中编写事务处理的方法小结

本文实例讲述了SQL Server存储过程中编写事务处理的方法.分享给大家供大家参考,具体如下: SQL Server中数据库事务处理是相当有用的,鉴于很多SQL初学者编写的事务处理代码存往往存在漏洞,本文我们介绍了三种不同的方法,举例说明了如何在存储过程事务处理中编写正确的代码.希望能够对您有所帮助. 在编写SQL Server 事务相关的存储过程代码时,经常看到下面这样的写法: begin tran update statement 1 ... update statement 2 ...

SQL Server 2005中查询并修改数据的不合理设计

在SQL Server 2000中,我们想在数据库表中直接修改数据,一般的操作方法是:在SQL Server 企业管理中,选择相应的表,点击右键,在"打开表"中选择"查询",在SQL编辑窗口中输入SQL语句找到要修改的记录,然后在结果窗口中直接修改相应的字段. 那在SQL Server 2005中,需要怎样操作呢? 在SQL Server Management Studio中,找到相应的表,点击右键,选择"Open Table",然后点击&quo

SQL Server 2000中的数据存储形式(二)

server|数据 SQL Server 是一个关系数据库管理系统,它最初是由Microsoft .Sybase 和Ashton-Tate三家公司共同开发的,于1988 年推出了第一个OS/2 版本.在Windows NT 推出后Microsoft与Sybase 在SQL Server 的开发上就分道扬镳了,Microsoft 将SQL Server 移植到Windows NT系统上专注于开发推广SQL Server 的Windows NT 版本,Sybase 则较专注于SQL Server在U

SQL Server 2005中XML数据建模简介

关系或 XML 数据模型 如果您的数据是高度结构化的,具有已知的架构,则关系模型可能对于数据存储最为有效.Microsoft SQL Server 提供了您可能需要的必要功能和工具.另一方面,如果结构是灵活的(半结构化和非结构化)或未知的,则必须适当地考虑如何对此类数据进行建模. 如果您需要独立于平台的模型,以便确保使用结构化和语义标记的数据的可移植性,则 XML 是一种不错的选择.而且,如果满足下列某些属性,则它还是一种适当的选择: • 您的数据比较稀疏,或者您不了解数据的结构,或者数据的结构