读书人

sqlserver 存储过程 临时表没法排序

发布时间: 2013-08-04 18:26:16 作者: rapoo

sqlserver 存储过程 临时表无法排序,求各位大神解释



USE [HLT_HIEP_V2]
GO
/****** Object: StoredProcedure [dbo].[master_querySupplierCertificate] Script Date: 06/08/2013 10:54:22 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[master_querySupplierCertificate]
@OrganizationDomain NVARCHAR(20),
@PartnerId nvarchar(20),
@CertificateId nvarchar(20),
@CertificateName nvarchar(80),
@CertificateType int,
@StartValidDate datetime,
@EndValidDate datetime,
@CertificatePhoto nvarchar(128),
@Markers int,
@StartCreateDate datetime,
@EndCreateDate datetime,
@PageIndex int,
@PageSize int,
@SortField nvarchar(20),
@SortMethod nvarchar(20)
as
begin
DECLARE @PageLowerBound int
DECLARE @PageUpperBound int
DECLARE @TotalRecords int
SET @PageLowerBound = @PageSize * @PageIndex
SET @PageUpperBound = @PageSize - 1 + @PageLowerBound
--设置排序字段和规则
IF(@SortField IS NULL OR @SortMethod IS NULL OR @SortField='' OR @SortMethod='')
BEGIN
SET @SortField = 'PartnerId'
SET @SortMethod = 'DESC'
END
--拼SQL 按条件排序查询
DECLARE @SqlStr nvarchar(1000)
SET @SqlStr=''

DECLARE @OrganizationProviderId uniqueidentifier
IF(@OrganizationDomain IS NOT NULL AND @OrganizationDomain<>'' AND @OrganizationDomain<>'%' AND @OrganizationDomain<>'%%')
BEGIN


SELECT @OrganizationProviderId=OrganizationProviderId FROM system_Organizations WHERE OrganizationDomain = @OrganizationDomain
if(@OrganizationProviderId is null) return -1
END

IF(@OrganizationProviderId IS NOT NULL)
SET @SqlStr=@SqlStr+'OrganizationProviderId = '''+CONVERT(nvarchar(50), @OrganizationProviderId, 50) + ''' AND '
IF(@PartnerId IS NOT NULL AND @PartnerId<>'' AND @PartnerId<>'%' AND @PartnerId<>'%%')
SET @SqlStr+='PartnerId like ''%'+@PartnerId + '%'' AND '
IF(@CertificateId IS NOT NULL AND @CertificateId<>'' AND @CertificateId<>'%' AND @CertificateId<>'%%')
SET @SqlStr+='CertificateId like ''%'+@CertificateId + '%'' AND '
IF(@CertificateName IS NOT NULL AND @CertificateName<>'' AND @CertificateName<>'%' AND @CertificateName<>'%%')
SET @SqlStr+='CertificateName like ''%'+@CertificateName + '%'' AND '
IF(@CertificateType IS NOT NULL )
SET @SqlStr+='CertificateType = '''+@CertificateType + ''' AND '
IF(@StartValidDate IS NOT NULL)
SET @SqlStr += 'StartValidDate >= '''+CONVERT(varchar(50), @StartValidDate, 21) + ''' AND '
IF(@EndValidDate IS NOT NULL)
SET @SqlStr+='EndValidDate <= '''+CONVERT(varchar(50), @EndValidDate, 21) + ''' AND '
IF(@CertificatePhoto IS NOT NULL AND @CertificatePhoto<>'' AND @CertificatePhoto<>'%' AND @CertificatePhoto<>'%%')
SET @SqlStr+='CertificatePhoto like ''%'+@CertificatePhoto + '%'' AND '
IF(@Markers IS NOT NULL AND @Markers<>'' AND @Markers<>'%' AND @Markers<>'%%')
SET @SqlStr+='Markers = '''+@Markers + ''' AND '
IF(@StartCreateDate IS NOT NULL)
SET @SqlStr += 'CreateDate >= '''+CONVERT(varchar(50), @StartCreateDate, 21) + ''' AND '
IF(@EndCreateDate IS NOT NULL)
SET @SqlStr+='CreateDate <= '''+CONVERT(varchar(50), @EndCreateDate, 21) + ''' AND '



IF(RIGHT(@SqlStr,4)='AND ') SET @SqlStr = LEFT(@SqlStr,LEN(@SqlStr)-4)
IF(@SqlStr<>'') SET @SqlStr=' WHERE '+@SqlStr
SET @SqlStr= 'SELECT OrganizationProviderId,PartnerId,CertificateId FROM master_SupplierCertificate '+@SqlStr
SET @SqlStr= @SqlStr + ' ORDER BY '+ @SortField + ' ' + @SortMethod

CREATE TABLE #sortInformation
(
IndexId int IDENTITY (0, 1) NOT NULL,
[OrganizationProviderId] uniqueidentifier NOT NULL,
PartnerId nvarchar(20),
CertificateId nvarchar(20)
)
INSERT INTO #sortInformation([OrganizationProviderId],PartnerId,CertificateId)
EXEC(@SqlStr)

SET @TotalRecords = @@ROWCOUNT

SELECT o.OrganizationProviderId
,o.[PartnerId]
,o.[CertificateId]
,[CertificateName]
,[CertificateType]
,[StartValidDate]
,[EndValidDate]
,[CertificatePhoto]
,[Remark]
,[Markers]
FROM [HLT_HIEP_V2].[dbo].[master_SupplierCertificate] AS o, #sortInformation AS s
WHEREo.OrganizationProviderId=s.OrganizationProviderId
and o.PartnerId = s.PartnerId
and o.CertificateId = s.CertificateId
AND s.IndexId
BETWEEN convert(varchar(10), @PageLowerBound)
and convert(varchar(10), @PageUpperBound)
order by @SortField + ' ' + @SortMethod

RETURN @TotalRecords
end



最后边的order by 排序不起作用 。求解释 sqlserver,存储过程


[解决办法]
select @SortField + ' ' + @SortMethod,看下什么值。
[解决办法]

引用:
Quote: 引用:

把最后一个查询语句也改成 EXEC(@SqlStr) 的形式


嗯 ,试过这个方法了 ,但是也不管用 。


Select @SqlStr 看一下 拼出来的sql语句是不是有问题
[解决办法]
太扯了,排序的内容都与要显示的字段没有关系,算出来都是一样的,如何排序。
[解决办法]
SELECT *
FROM T
ORDER BY @SortField
这样的效果只能通过动态SQL来实现, 你把整个过程都用动态SQL吧, 包括表变量的部分.
[解决办法]
1. 语法看上去OK,@sqlstr只有nvarchar(1000)宽度,是不是宽度1000不够了?
2. 可以在程序运行中,先调试下Storedprocedure,把@sqlstr打印出来执行看结果
3 .如果调试SP也无问题,再使用SQL PROFILER跟踪下看产生的SQL语句,再执行下产生的结果
如果SQL语句都没有问题,最后再看第4步
4. 检查内存够不够,排序需要大量内存支持,如果排序区内存不够会产生例外情况

读书人网 >SQL Server

热点推荐