现在的位置: 首页 > 综合 > 正文

之前的一些sql

2013年10月16日 ⁄ 综合 ⁄ 共 12039字 ⁄ 字号 评论关闭

参数查询

ALTER PROCEDURE [dbo].[PReportSceneOrderDetail]

(
@AgentId varchar(20),
@PayType tinyint,
@StatusOperator char(1),
@Status tinyint,
@TimeType tinyint,
@BeginTime datetime,
@EndTime datetime,
@SceneNameOperator char(1),
@SceneName varchar(60),
@TicketName varchar(60)
)
AS
BEGIN
DECLARE
@sql nvarchar(4000)
SET @sql='SELECT Orders.OrderId, Scene.SceneName, 
SceneTicket.TicketName, OrderContact.Mobile, Users.UserName,Users.UserId, 
SceneTicket.PayType,Orders.Status,Orders.CreateTime, OrderScene.PlanGoDate, OrderCheckin.CheckinDate,
OrderScene.TicketNum, ISNULL(OrderCheckin.CheckinNum,0) AS CheckinNum,
OrderScene.SalePrice,OrderScene.CostPrice,OrderScene.AgentMaxCommission, 
OrderScene.AgentCommissionRate,OrderContact.ContactName,
UserOperator.OperatorLoginId,UserOperator.OperatorName
FROM Orders
INNER JOIN OrderScene ON (OrderScene.OrderId=Orders.OrderId)
LEFT JOIN OrderContact ON (OrderContact.OrderId=Orders.OrderId)
LEFT JOIN Users ON (Users.UserId=OrderScene.AgentId)
INNER JOIN SceneTicket ON (SceneTicket.TicketId=OrderScene.TicketId)
INNER JOIN Scene ON (Scene.SceneId = SceneTicket.SceneId)
LEFT JOIN OrderCheckin ON Orders.OrderId = OrderCheckin.OrderId
LEFT JOIN UserOperator ON (Orders.Saler=UserOperator.OperatorId)
WHERE Orders.OrderType = 0'
IF @AgentId<>'' AND @AgentId IS NOT NULL
BEGIN
SET @sql=@sql+' AND (OrderScene.AgentId LIKE @AgentId OR Users.UserName LIKE @AgentId)'
END
IF @PayType IS NOT NULL
BEGIN
SET @sql=@sql+' AND (SceneTicket.PayType=@PayType)'
END
IF @Status IS NOT NULL
BEGIN 
IF @StatusOperator='0'
SET @sql=@sql+' AND (Orders.Status=@Status)'
ELSE IF @StatusOperator='1'
SET @sql=@sql+' AND (Orders.Status<>@Status)'
ELSE IF @StatusOperator='2'
SET @sql=@sql+' AND (Orders.Status<@Status)'
ELSE IF @StatusOperator='3'
SET @sql=@sql+' AND (Orders.Status<=@Status)'
ELSE IF @StatusOperator='4'

SET @sql=@sql+' AND (Orders.Status>@Status)'
ELSE 
SET @sql=@sql+' AND (Orders.Status>=@Status)'
END
IF @TimeType=0
BEGIN
SET @sql=@sql+' AND (OrderScene.CreateTime>=@BeginTime AND OrderScene.CreateTime<DATEADD(d,1,@EndTime))'
END
ELSE IF @TimeType=1
BEGIN
SET @sql=@sql+' AND (OrderScene.PlanGoDate>=@BeginTime AND OrderScene.PlanGoDate<DATEADD(d,1,@EndTime))'
END
ELSE
BEGIN
SET @sql=@sql+' AND (OrderCheckin.CheckinDate>=@BeginTime AND OrderCheckin.CheckinDate<DATEADD(d,1,@EndTime))'
END
IF @SceneNameOperator='1'
BEGIN
SET @sql=@sql+' AND (Scene.SceneName LIKE @SceneName)'
END
ELSE IF  @SceneNameOperator='2'
BEGIN
SET @sql=@sql+' AND (Scene.SceneName NOT LIKE @SceneName)'
END
IF @TicketName<>'' AND @TicketName IS NOT NULL
BEGIN
SET @sql=@sql+' AND (SceneTicket.TicketName LIKE @TicketName)'
END

SET @AgentId=N'%'+@AgentId+N'%';
SET @SceneName=N'%'+@SceneName+N'%';
SET @TicketName=N'%'+@TicketName+N'%';

EXEC sp_executesql @sql,N'@AgentId varchar(20), @PayType tinyint, @Status tinyint, @BeginTime datetime, @EndTime datetime, @SceneName varchar(60), @TicketName varchar(60)',
@AgentId,@PayType,@Status,@BeginTime,@EndTime,@SceneName,@TicketName
END

--调试方式
/*
DECLARE @AgentId varchar(20),
@PayType tinyint,
@StatusOperator char(1),
@Status tinyint,
@TimeType tinyint,
@BeginTime datetime,
@EndTime datetime,
@SceneNameOperator char(1),
@SceneName varchar(60),
@TicketName varchar(60)

SET @TimeType=0
SET @BeginTime='2010-01-01'
SET @EndTime='2011-01-01'
SET @SceneNameOperator=''

SET @SceneName='白'

BEGIN
DECLARE
@sql nvarchar(4000)
SET @sql=''

SET @AgentId=N'%'+@AgentId+N'%';
SET @SceneName=N'%'+@SceneName+N'%';
SET @TicketName=N'%'+@TicketName+N'%';

EXEC sp_executesql @sql,N'@AgentId varchar(20), @PayType tinyint, @Status tinyint, @BeginTime datetime, @EndTime datetime, @SceneName varchar(60), @TicketName varchar(60)',
@AgentId,@PayType,@Status,@BeginTime,@EndTime,@SceneName,@TicketName
END

*/

==============================

监时表

ALTER PROCEDURE [dbo].[PReportSceneOrderYear1]
(
@TheYear varchar(20)
)
AS
BEGIN
DECLARE @TopNum INT
DECLARE @MinCheckinNumTop DECIMAL
DECLARE @MinCustomerAmountTop DECIMAL
DECLARE @MinProviderAmountTop DECIMAL
DECLARE @MinAgentAmountTop DECIMAL
DECLARE @MinGrossAmountTop DECIMAL
SET @TopNum=10

SELECT  
SUM(OrderCheckin.CheckinNum) CheckinNum,
SUM(OrderScene.SalePrice*OrderCheckin.CheckinNum) AS CustomerAmount,
SUM(OrderScene.CostPrice*OrderCheckin.CheckinNum) ProviderAmount,
SUM(OrderScene.AgentMaxCommission*OrderScene.AgentCommissionRate*OrderCheckin.CheckinNum)
AS AgentAmount,
SUM((OrderScene.SalePrice*OrderCheckin.CheckinNum)
- (OrderScene.CostPrice*OrderCheckin.CheckinNum)
- (OrderScene.AgentMaxCommission*OrderScene.AgentCommissionRate*OrderCheckin.CheckinNum))
AS GrossAmount,
MIN(Scene.SceneName) AS SceneName,
Scene.SceneId
INTO #temp
FROM OrderScene
INNER JOIN OrderCheckin ON (OrderCheckin.OrderId = OrderScene.OrderId) 
INNER JOIN SceneTicket ON(OrderScene.TicketId=SceneTicket.TicketId)
INNER JOIN Scene ON(SceneTicket.SceneId=Scene.SceneId)
WHERE YEAR(OrderScene.PlanGoDate) = @TheYear
GROUP BY Scene.SceneId

SELECT @MinCheckinNumTop=MIN(CheckinNum) FROM
(SELECT TOP (@TopNum) CheckinNum FROM #temp ORDER BY CheckinNum DESC) AS temp1

SELECT @MinCustomerAmountTop=MIN(CustomerAmount) FROM
(SELECT TOP (@TopNum) CustomerAmount FROM #temp ORDER BY CustomerAmount DESC) AS temp1

SELECT @MinProviderAmountTop=MIN(ProviderAmount) FROM
(SELECT TOP (@TopNum) ProviderAmount FROM #temp ORDER BY ProviderAmount DESC) AS temp1

SELECT @MinAgentAmountTop=MIN(AgentAmount) FROM
(SELECT TOP (@TopNum) AgentAmount FROM #temp ORDER BY AgentAmount DESC) AS temp1

SELECT @MinGrossAmountTop=MIN(GrossAmount) FROM
(SELECT TOP (@TopNum) GrossAmount FROM #temp ORDER BY GrossAmount DESC) AS temp1

SELECT *
,CASE WHEN CheckinNum>=@MinCheckinNumTop THEN SceneName ELSE '其他' END 
AS SceneNameByCheckinNum
,CASE WHEN CustomerAmount>=@MinCustomerAmountTop THEN SceneName ELSE '其他' END 
AS SceneNameByCustomerAmount
,CASE WHEN ProviderAmount>=@MinProviderAmountTop THEN SceneName ELSE '其他' END
AS SceneNameByProviderAmount 
,CASE WHEN AgentAmount>=@MinAgentAmountTop THEN SceneName ELSE '其他' END 
AS SceneNameByAgentAmount
,CASE WHEN GrossAmount>=@MinGrossAmountTop THEN SceneName ELSE '其他' END 
AS SceneNameByGrossAmount
FROM #temp

DROP TABLE #temp
 
END

==========================

序列号

ALTER PROCEDURE [dbo].[PBaseSerialId]
(
@SerialType varchar(20),
@Increment tinyint
)
AS
BEGIN
SET LOCK_TIMEOUT 2000;SET TRAN ISOLATION LEVEL SERIALIZABLE;
BEGIN TRAN;
UPDATE BaseSerialId SET SerialId=CAST(SerialId AS INT)+@Increment WHERE SerialType = @SerialType; IF @@ERROR!=0 ROLLBACK TRAN;
SELECT SerialId FROM BaseSerialId WHERE SerialType = @SerialType; IF @@ERROR!=0 ROLLBACK TRAN;
COMMIT TRAN;
END

===============================

/*********************************************
读取数据库中所有表的结构信息
*********************************************/
ALTER Procedure [dbo].[GetAllTableInfo] As
begin

DECLARE @strName nvarchar(128), @Tid int,@strOwner varchar(50) --,@au_id varchar(11)
set nocount on
--获取所有的用户表信息

DECLARE All_Tables CURSOR
  FOR select convert(nvarchar(128),Name),ID from sysobjects where OBJECTPROPERTY(id, N'IsUserTable')=1 and OBJECTPROPERTY(id, N'IsMSShipped')=0 order by Name

Create Table #ColInfo
(
      TName nvarchar(50),          --表名称
      ColName nvarchar(50),        --列名称
      ColID smallint,              --列ID
      REMARK nvarchar(1000),       --注释
      Type varchar(50),            --数据类型
      DefaultValue nvarchar(255),  --默认值
      IsIden nchar(1),             --是否标识列
      IsAllowNull nchar(1),        --是否允许为空
      IsPrimaryKey nchar(1)        --是否为主键
)

--主键信息
Create Table #PkInfo
(
      TABLE_QUALIFIER nvarchar(50),
      TABLE_OWNER varchar(50),
      TABLE_NAME nvarchar(50),
      COLUMN_NAME nvarchar(50),
      KEY_SEQ int,
      PK_NAME nvarchar(50)
)

--set @strOwner=user_name()
set @strOwner='dbo'

OPEN All_Tables
FETCH NEXT FROM All_Tables into @strName,@Tid
while @@FETCH_STATUS = 0
begin
      --插入表及其注释信息
      Insert Into #ColInfo
      SELECT @StrName,'',0,isnull(convert(nvarchar(1000),Value),''),'','','','',''
      FROM (select @strName TName) A left join 
             ::fn_listextendedproperty('MS_Description', N'USER', N'dbo', N'Table', @strName, NULL, NULL)  --表的注释信息
            ON 1=1
      --插入列信息
      insert into #ColInfo
      select @strName,C.name CName,c.colid,isnull(convert(nvarchar(1000),R.value),''),
             (case when (C.xtype>=34 and C.xtype<=58) or C.xtype in (61,98,99,104,127,189) then T.name 
  when c.xtype in (59,60,106,108,122) then T.name+'('+convert(varchar,C.xprec)+','+convert(varchar,C.xscale)+')' 
else T.name+'('+convert(varchar,c.prec)+'/'+convert(varchar,C.length)+')' end),
             isnull(Def.text,''),
             (case c.status when 0x80 then '√' else '' end),
             case isnullable when 1 then '是' else '否' end,
             ''
      from (systypes T
           inner join
            (  syscolumns C
                left join  SysComments Def
                on C.cdefault=Def.id and 1=Def.colid
            ) on T.xtype=C.xtype and T.xusertype=C.xusertype
           )
           left join 
             ::fn_listextendedproperty('MS_Description', N'USER', N'dbo', N'Table', @strName, N'Column', NULL) R --列的注释信息
           on convert(varchar,R.objname)=convert(varchar,C.Name)
      where C.id=object_id(@strName)
order by c.colid

      insert into #PkInfo EXEC [dbo].[sp_pkeys] @strName,@strOwner, DEFAULT

      fetch next from All_Tables into @strName,@Tid
end

--更新主键信息
update #ColInfo
set IsPrimaryKey='*'
from #PkInfo
where #PkInfo.TABLE_NAME=#ColInfo.TName and #PkInfo.COLUMN_NAME=#ColInfo.ColName

Close All_Tables
DEALLOCATE All_Tables

select '☆***☆' ObjectName,'' REMARK,'' Col1,'' Col2,'' Col3,'' Col4,'' Col5,TName TableName,0 flag,colid
from #ColInfo
where ColName=''

union
select  '表名:'+TName,REMARK,'','','','','',TName,1 flag,colid
from #ColInfo
where ColName=''

union
select '列名','注释','数据类型','默认值','标识','允许空','主键',TName,2,colid
from #ColInfo
where ColName=''

union
select ColName,REMARK,Type,DefaultValue,IsIden,IsAllowNull,IsPrimaryKey,TName,3,colid
from #ColInfo
where ColName<>''

order by 8,9,10

drop table #PkInfo
drop table #ColInfo  

end

=========================

/*********************************************
读取数据库中指定表的结构信息
*********************************************/

ALTER Procedure [dbo].[GetTableInfo_A] @tableName nvarchar(128) As
begin

DECLARE @strName nvarchar(128), @Tid int,@strOwner varchar(50) --,@au_id varchar(11)

set nocount on

DECLARE All_Tables CURSOR
  FOR select convert(nvarchar(128),Name),ID from sysobjects where OBJECTPROPERTY(id, N'IsUserTable')=1 and OBJECTPROPERTY(id, N'IsMSShipped')=0 and object_name(id)=@tableName order by Name

Create Table #ColInfo
(
      TName nvarchar(50),           --表名称
      ColName nvarchar(50),         --列名称
      ColID smallint,              --列ID
      REMARK nvarchar(1000),       --注释
      Type varchar(50),            --数据类型
      DefaultValue nvarchar(255),   --默认值
      IsIden nchar(1),             --是否标识列
      IsAllowNull nchar(2),        --是否允许为空
      IsPrimaryKey nchar(1)        --是否为主键
)

--主键信息
Create Table #PkInfo
(
      TABLE_QUALIFIER nvarchar(50),
      TABLE_OWNER varchar(50),
      TABLE_NAME nvarchar(50),
      COLUMN_NAME nvarchar(50),
      KEY_SEQ int,
      PK_NAME nvarchar(50)
)

set @strOwner=user_name()

OPEN All_Tables
FETCH NEXT FROM All_Tables into @strName,@Tid
while @@FETCH_STATUS = 0
begin
      --插入表及其注释信息
      Insert Into #ColInfo
      SELECT @StrName,'',0,isnull(convert(nvarchar(1000),Value),''),'','','','',''
      FROM (select @strName TName) A left join 
             ::fn_listextendedproperty('MS_Description', N'USER', N'dbo', N'Table', @strName, NULL, NULL)  --表的注释信息
            ON 1=1
      --插入列信息
      insert into #ColInfo
      select @strName,C.name CName,c.colid,isnull(convert(nvarchar(1000),R.value),''),
             (case when (C.xtype>=34 and C.xtype<=58) or C.xtype in (61,98,99,104,127,189) then T.name 
  when c.xtype in (59,60,106,108,122) then T.name+'('+convert(varchar,C.xprec)+','+convert(varchar,C.xscale)+')' 
else T.name+'('+convert(varchar,c.prec) -- +'/'+convert(varchar,C.length)
+')' end),
             isnull(Def.text,''),
             (case c.status when 0x80 then '√' else '' end),
             case isnullable when 1 then '空' else '非空' end,
             ''
      from (systypes T
           inner join
            (  syscolumns C
                left join  SysComments Def
                on C.cdefault=Def.id and 1=Def.colid
            ) on T.xtype=C.xtype and T.xusertype=C.xusertype
           )
           left join 
             ::fn_listextendedproperty('MS_Description', N'USER', N'dbo', N'Table', @strName, N'Column', NULL) R --列的注释信息
           on convert(varchar,R.objname)=convert(varchar,C.Name)
      where C.id=object_id(@strName)
order by c.colid

      insert into #PkInfo EXEC [dbo].[sp_pkeys] @strName,@strOwner, DEFAULT

      fetch next from All_Tables into @strName,@Tid
end

--更新主键信息
update #ColInfo
set IsPrimaryKey='*'
from #PkInfo
where #PkInfo.TABLE_NAME=#ColInfo.TName and #PkInfo.COLUMN_NAME=#ColInfo.ColName

Close All_Tables
DEALLOCATE All_Tables

/*
select '☆***☆' ObjectName,'' REMARK,'' Col1,'' Col2,'' Col3,'' Col4,'' Col5,TName TableName,0 flag,colid
from #ColInfo
where ColName=''

union
*/
select  TName,'','',REMARK,colid --,'','','','','',TName,1 flag,colid
from #ColInfo
where ColName=''

union
/*
select '列名','注释','数据类型','默认值','标识','允许空','主键',TName,2,colid
from #ColInfo
where ColName=''

union
*/
select ColName,Type,IsAllowNull,REMARK,colid --,DefaultValue,IsIden,IsPrimaryKey,TName,3
from #ColInfo
where ColName<>''

order by colid

drop table #PkInfo
drop table #ColInfo  

end

=========================

curd,

SET NOCOUNT ON(R)
SET NOCOUNT OFF(cud)

【上篇】
【下篇】

抱歉!评论已关闭.