sql 常用语句积累

1.如何删除表中的重复记录?(这里指记录的每个字段都要相同)
select distinct * into #temp from tab
delete tab
insert tab select * from #temp
drop table #temp

1.DISTINCT 是 SUM、AVG 和 COUNT 的可选关键字。如果使用 DISTINCT,那么在计算总和、平均值或计数之前,先消除重复的值。

如果使用 DISTINCT 关键字,表达式必须只包含列名。而不能包含算术表达式。

以下查询返回商务书籍的平均价格(不包括重复的值):

USE pubs
SELECT AVG(DISTINCT price)
FROM titles
WHERE type = 'business'

2.DISTINCT 关键字可从 SELECT 语句的结果中除去重复的行,distinct 后面的字段可以是多个或*,是一个那就各军兵种那个字段来取不重复的,
如果是多个,那就是筛选所选的字短都相同的记录.
USE pubs
SELECT DISTINCT au_id--按照一个字段筛选
FROM titleauthor

USE pubs
SELECT DISTINCT au_id,au_name --按照两个字段筛选
FROM titleauthor


2.怎样返回数据库中用户表的表单名
select name from sysobjects where xtype='U'
select name from sysobjects where xtype = 'u' and status >=0

3.
http://community.csdn.net/Expert/topic/4191/4191899.xml?temp=.5814325
各位大大请帮个忙,
一个表中A字段是int型的自动编号,B字段是首先要获取A字段已有的自动编号数据再经过加入时间等后生成的数据,表如下
C,D(日期),E为其他数据
列名 A(自动递加) B(A字段数据+日期等) C D E
---------------------------------------------------
1 A+D . . .
2 A+D . . .


---- 建立测试环境:
create table table1(a int identity,b varchar(20),c datetime,d datetime,e int)


create proc proc1
@c datetime,
@d datetime,
@e int
as
declare @f int
insert table1 (c,d,e) values(@c,@d,@e)
select @f=@@identity
if @@error=0
begin
update table1 set b=convert(varchar,a)+convert(varchar(12),d,120) where a=@f
end

---执行存储过程
exec proc1 '2001-10-01','2001-10-20',45

select * from table1

4.事务问题
http://community.csdn.net/Expert/topic/4245/4245634.xml?temp=.663891

(1)try:
-------------------------------------------------------------------------
CREATE PROCEDURE sp_Order_UpdateOrderFormHeadByAffirm
@OrderFormHeadID int,
@AffirmPerson nvarchar(50)
AS
BEGIN TRANSACTION
DECLARE @OrderFormNo nvarchar(50), @FranchiserNo nvarchar(10), @TotalSum decimal(18,4)

--更新状态为确认
UPDATE
AD_U_HEAD_A_SSGL
SET
Tag = 1
WHERE
OrderFormHeadID = @OrderFormHeadID

IF (@@error <> 0)
BEGIN
ROLLBACK TRANSACTION
RETURN
END


------------------------------------------------------------------------------------------

--返回 订单管理(HEAD)的一些信息
SELECT
@OrderFormNo = OrderFormNo,
@FranchiserNo = FranchiserNo,
@TotalSum = TotalSum
FROM
AD_U_HEAD_A_SSGL
WHERE
OrderFormHeadID = @OrderFormHeadID

IF (@@error <> 0)
BEGIN
ROLLBACK TRANSACTION
RETURN
END
------------------------------------------------------------------------------------------

--更新 订单管理(DATA)
UPDATE
AD_U_DATA_A_SSGL
SET
Tag = 1,
AffirmPerson = @AffirmPerson,
AffirmDate = GETDATE()
WHERE
OrderFormNo = @OrderFormNo

IF (@@error <> 0)
BEGIN
ROLLBACK TRANSACTION
RETURN
END
------------------------------------------------------------------------------------------

--经销代理资信余额(MAIN)
EXEC sp_Order_UpdateCreditBalance @FranchiserNo, 0, 0, 0, @TotalSum, 0

IF (@@error <> 0)
BEGIN
ROLLBACK TRANSACTION
RETURN
END
------------------------------------------------------------------------------------------
--新增 订单确认日志(SLOG)
INSERT INTO
AD_U_SLOG_A_DDQR(OrderFormNo, GoodsNo, Quantity,
UnitPrice, ProductPackingNo,TotalQuantity, TotalSum, Rebate, FactSum)
SELECT
OrderFormNo, GoodsNo, Quantity, UnitPrice, ProductPackingNo,
TotalQuantity, TotalSum, Rebate, FactSum
FROM
AD_U_DATA_A_SSGL
WHERE
OrderFormNo = @OrderFormNo

IF (@@error <> 0)
BEGIN
ROLLBACK TRANSACTION
RETURN
END

COMMIT TRANSACTION
GO
(2)----------------------------------
CREATE PROCEDURE sp_Order_UpdateOrderFormHeadByAffirm
@OrderFormHeadID int,
@AffirmPerson nvarchar(50)
AS
SET XACT_ABORT ON
BEGIN TRANSACTION
......

(3)你说得没错 其实你那样用事务的画没什么作用,每个存储过程都是一个事务。如果用事务最好有出错的处理是否回滚之类的东西。但是要考虑好表之间的关联性,如果都是一些单独的表,可以分几个事务处理,如果是父子表还是要放在一个事务里面。保证其数据的准确
性。
4请给条如何找出重复记录的SQL语句

select id,name,parentDeptid,status as state,type,showindex,url,corpid = 1001
from zfj_dept

日期:
select convert(varchar(16),getDate(),120) 2005-11-18 10:20
select convert(varchar,datepart(minute,getdate())) 获得分钟且转换为字符型

内联结/外联结
--返回两个表中共有的所有记录
select *
from testTable as a
inner join TestTableChild as b on a.id = b.parentid

--返回(左表)TestTable所有记录
select *
from testTable as a
left outer join TestTableChild as b on a.id = b.parentid

--返回(右表)TestTableChild的所有记录
select *
from testTable as a
right outer join TestTableChild as b on a.id = b.parentid

--- 返回 两个表里共有的记录,且不重复
select a.id,a.name,b.name
from testTable as a
inner join TestTableChild as b on a.id = b.parentid
group by a.id,a.name,b.name

--返回(左表)TestTable所有记录
select a.id,a.name,b.name
from testTable as a
left outer join TestTableChild as b on a.id = b.parentid
group by a.id,a.name,b.name


--------
select a.id,a.subject,b.contentType,c.AuguryUp,c.AuguryDown,
case c.type when '1' then '爱情' when '2' then '财运' when '3' then '事业' end as type

from MMS_Content as a
left outer Join MMS_ContentChild as b on a.id = b.parentid
left outer join AuguryList as c on a.id = c.parentid

where a.dept = 6
group by a.id,a.subject,b.contentType,c.AuguryUp,c.augurydown,c.type

向一个表A中插入记录,并且插入的记录在A中不存在(通过一个字段来判断)
insert into trace_users (tracekey,muteSMS,CreateTime,traceuser,tracetime,traceSlot,traceduration)

select 'TRACE_TIMER',0,getdate(),mobileid,getdate(),'30','0'
from Epm_EmployeeList where corpid = 10001
and mobileid not in (select traceuser from trace_users )
and mobileid like '13%' and len(mobileid) = 11

下面的要好些(not exists)

insert into trace_users(tracekey,muteSMS,CreateTime,traceuser,tracetime,traceSlot,traceduration)

select ' TRACE_TIMER ' , 0 , getdate (),mobileid, getdate (), ' 30 ' , ' 0 '
from Epm_EmployeeList where corpid = 10001
and not exists ( select traceuser from trace_users)
and mobileid like ' 13% ' and len (mobileid) = 11


cast 和convert DateAdd和DateDiff

-- 调度设置的时候更新人员状态
--
EPM_EmployeeList里的active=1
--
trace_Timer里的active=1
--
trace_users里的traceduration清0
--
执行例子:execup_SetSchedule1001,'1009,1019'
ALTER proc up_SetSchedule
-- createprocup_SetSchedule
@nCorpId int ,
@vchEmployeeIds varchar ( 8000 ),
@TimeStart DateTime ,
@TimeEnd DateTime

as
declare @sql varchar ( 8000 ), @TraceSolt int
SET XACT_ABORT ON -- 任何一部有问题是都会回滚事务
BEGIN TRANSACTION -- 开始事务
update EPM_EmployeeList set activeStatus = 0 where corpid = @nCorpId and activeStatus != 0
if ( @vchEmployeeIds != '' )
begin
set @sql = ' updateEPM_EmployeeListsetactiveStatus=1wherecorpid= ' + convert ( varchar ( 10 ), @nCorpId ) + ' andidin( ' + @vchEmployeeIds + ' ) '
exec ( @sql )
-- 更新Trace_timer
set @sql = ' updatetrace_TimersetactiveStatus=1wherecorpid= ' + convert ( varchar ( 10 ), @nCorpId ) + ' andmobileidin( '
set @sql = @sql + ' selectmobileidfromEPM_EmployeeListwhereidin( ' + @vchEmployeeIds + ' )) '
exec ( @sql )
select @TraceSolt = ( select tracesolt from EPM_EnterpriseList where id = @nCorpId )
(
' +@vchEmployeeIds+ ' )) '
set@sql=
' update trace_users set createTime = ''' +cast(@timeStartasvarchar)+ ''''
set@sql=@sql+
' ,traceTime = ''' +cast(DateAdd(minute,@TraceSolt,@timeStart)asvarchar)
set@sql=@sql+
''' ,traceDuration = ''' +convert(varchar,datediff(minute,@timeStart,@timeEnd))+ ''' where traceuser in ( '
set@sql=@sql+
' select mobileid from EPM_EmployeeList where id in ( ' +@vchEmployeeIds+ ' )) '
exec(@sql)
end
COMMITTRANSACTION--提交事务
GO



--导出企业根据大类别。四个表就晕了。。。。。。。

--插入到临时表里
select distinct (a.id),a.corpname,a.corplinkman,a.phonenumber,a.createtime,a.address
,(select distinct d.name
from
dz_subinfoDefine as c,
dz_mainInfoDefine as d
where c.maintype = d.maintype
and c.subtype = b.infotype) as type

into #table2

from dz_corporation as a
left join dz_information as b on a.id = b.corpid

--插入到表里.需要两次是因为无法对类别(大类)进行排序
select case when type IS NULL then '未知类别' else type end as 大类别,corpname as 名称 ,corplinkman as 联系人,phonenumber as 联系电话,address as 地址 ,createTime as 创建时间 into Table1 from #table2
order by type
----删除临时表
drop table #table2


好的方法????找不到........可能是数据库设计的不好.

通过另一个表来更新本表的记录.
begin transaction
update EPM_Employeelist set loginname =b.loginname,password= b.password
from zfj_users as b
where
EPM_Employeelist.userid = b.userid
and corpid = 10001
rollback transaction

在in子句中如何写变量的表达式问题

declare @ids varchar ( 8000 )
set @ids = ' 14501,14502,14503 '
select * from table1 where charindex ( ' , ' + cast (id as varchar ( 20 )) + ' , ' , ' , ' + @ids + ' , ' ) > 0



一个存储过程
-获得系统对象:
sysobjects
在数据库内创建的每个对象(约束、默认值、日志、规则、存储过程等)在表中占一行。只有在 tempdb 内,每个临时对象才在该表中占一行。
--所有procedure && 名称='up_DeleteEnterprise'
select * from sysobjects where xtype = 'P' and name = 'up_DeleteEnterprise'
--所有Triger
select * from Sysobjects where xtype = 'TR'
--所有用户Table
select * from Sysobjects where xtype = 'u'
xtype的值:

-- 调度设置的时候更新人员状态
--
EPM_EmployeeList里的active=1
--
trace_Timer里的active=1
--
trace_users里的traceduration清0
--
执行例子:execup_SetSchedule1001,'1009,1019'
alter proc up_SetSchedule
-- createprocup_SetSchedule
@nCorpId int ,
@vchEmployeeIds varchar ( 8000 ),
@TimeStart DateTime ,
@TimeEnd DateTime

as
declare @sql varchar ( 8000 ), @TraceSolt int
SET XACT_ABORT ON -- 任何一部有问题是都会回滚事务
BEGIN TRANSACTION -- 开始事务
-- 更新企业表中的起始时间
update EPM_EnterpriseList set ScheduleStart = @TimeStart ,ScheduleEnd = @TimeEnd
-- 更新员工调度状态(清0)
update EPM_EmployeeList set activeStatus = 0 where corpid = @nCorpId and activeStatus != 0 or activeStatus is null
-- Trace_Timer里员工状态清0
update Trace_Timer set activeStatus = 0 where corpid = @nCorpId and activeStatus != 0 or activeStatus is null
-- Trace_Users里员工状态清0
update Trace_Users set traceDuration = 0 where traceUser in ( select mobileid from EPM_EmployeeList where corpid = @nCorpId )

if ( @vchEmployeeIds != '' )
begin
set @sql = ' updateEPM_EmployeeListsetactiveStatus=1wherecorpid= ' + convert ( varchar ( 10 ), @nCorpId ) + ' andidin( ' + @vchEmployeeIds + ' ) '
exec ( @sql )
-- 更新Trace_timer执法局不需要对次表操作.
-- set@sql='updatetrace_TimersetactiveStatus=1wherecorpid='+convert(varchar(10),@nCorpId)+'andmobileidin('
-- set@sql=@sql+'selectmobileidfromEPM_EmployeeListwhereidin('+@vchEmployeeIds+'))'
-- exec(@sql)
select @TraceSolt = ( select tracesolt from EPM_EnterpriseList where id = @nCorpId )
-- 更新Trace_users有与没有corpid所以只能根据手机号了.
-- set@sql='updatetrace_userssettraceDuration=0wheretraceuserin('
-- set@sql=@sql+'selectmobileidfromEPM_EmployeeListwhereidin('+@vchEmployeeIds+'))'
-- 先判断用户是否在Trace_Users里存在,如果存在则修改它,如果不存在需要添加一条记录.
-- 可以先增减没有的记录,然后统一更新这些记录.
-- 增加
exec up_SetSchedule_AddUsers @vchEmployeeIds -- 存储过程里执行存储过程.
-- 更新
set @sql = ' updatetrace_userssetcreateTime= ''' + cast ( @timeStart as varchar ) + ''''
set @sql = @sql + ' ,traceTime= ''' + cast ( DateAdd (minute, - @TraceSolt , @timeStart ) as varchar )
set @sql = @sql + ''' ,traceDuration= ''' + convert ( varchar , datediff (minute, @timeStart , @timeEnd )) + ''' wheretraceuserin( '
set @sql = @sql + ' selectmobileidfromEPM_EmployeeListwhereidin( ' + @vchEmployeeIds + ' )) '
exec ( @sql )
end
COMMIT TRANSACTION -- 提交事务
GO



-- 增加表里不存在的记录.传递的参数为员工ID的集合(号码间用逗号分开),判断是否存在的方法,与上个相比效率高
create procedure up_SetSchedule_AddUsers
@vchEmployees varchar ( 8000 ) = ''
as
-- Declare@vchEmployeesvarchar(8000)
-- set@vchEmployees='1172,1229,1271'
-- Set@vchEmployees=''''+replace(@vchEmployees,',',''',''')+''''
-- select@vchEmployees
declare @vchMobiles varchar ( 8000 ) -- 手机号码集合
-- set@vchEmployees='1172,1229,1271'
SET XACT_ABORT ON -- 一步出现问题则全部回滚
Begin Transaction
-- 获得手机号码集合
set @vchMobiles = ''
select @vchMobiles = @vchMobiles + ' , ' + cast (mobileid as varchar ( 20 )) from EPM_EmployeeList where charindex ( ' , ' + cast (id as varchar ( 20 )) + ' , ' , ' , ' + @vchEmployees + ' , ' ) > 0
set @vchMobiles = stuff ( @vchMobiles , 1 , 1 , '' )
-- select@vchMobiles

while charindex ( ' , ' , @vchMobiles ) > 0
begin
insert into Trace_Users(TraceKey,MuteSMS,CreateTime,TraceUser,TraceTime,TraceSlot,TraceDuration)
select ' TRACE_TIMER ' , 0 , getdate (), left ( @vchMobiles , charindex
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值