加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

ms sqlserver常用sql语句

发布时间:2020-12-12 15:41:33 所属栏目:MsSql教程 来源:网络整理
导读:? -- 获取SqlServer中表结构 ? SELECT ?syscolumns.name,systypes.name,syscolumns.isnullable, syscolumns.length? FROM ?syscolumns,?systypes? WHERE ?syscolumns.xusertype? = ?systypes.xusertype? AND ?syscolumns.id? = ? object_id ( ' 你的表名 ' )

?

-- 获取SqlServer中表结构

?

SELECT?syscolumns.name,systypes.name,syscolumns.isnullable,
syscolumns.length?
FROM?syscolumns,?systypes?
WHERE?syscolumns.xusertype?=?systypes.xusertype?
AND?syscolumns.id?=?object_id('你的表名')

?

-- 单独查询表递增字段
select [name] from syscolumns where
id=object_id(N'你的表名') and COLUMNPROPERTY(id,name,'IsIdentity')=1

?


-- 获取表主外键约束
exec sp_helpconstraint?? '你的表名'

?

-- 自定义函数递归调用

此方法适用于无限级分类情况下取出所有的父分类数据

CREATE function sp_GetAllParentByClassID
(?
?? @classID int --参数
)
returns varchar(500)
as
begin

declare @ParentClassID varchar(15) --变量父ID
declare @result varchar(500)??? --变量@result
set? @result = ''
--首先根据传入的ClassID获取其父ID,ParentClassID
?SELECT??? @ParentClassID = ParentClassID? FROM tClass
??? where? ClassID = @classID

if (@ParentClassID <> 0)--如果不是根节点
begin???????????
??? -- 再将@ParentClassID父ID作为ClassID传入 进行自调用
???? set @result =? dbo.sp_GetAllParentByClassID(@ParentClassID) + @ParentClassID+'_'?
???
end
??? return? @result
end

有的SQL版本运行上述SQL语句在dbo.sp_GetAllParentByClassID(@ParentClassID)会报错。
原因是,此时正的创建dbo.sp_GetAllParentByClassID函数,而还未创建,
在又在此处调用dbo.sp_GetAllParentByClassID(@ParentClassID),因此会提示没有这个对象,
解决办法是先去掉dbo.sp_GetAllParentByClassID(@ParentClassID)创建后再Alter修改 即可!

?

?

-- 如何将exec执行结果放入变量 num?中(自定义sql语句传出参数)

declare @num int,
@sqls nvarchar(4000)
set @sqls='select @a=count(*) from tableName '
exec sp_executesql @sqls,N'@a int output',@num output
select @num

--------------统计类-------------

SELECT ZIP FROM CustomersWHEREState = ''KY'' GROUP BY ALL ZIP
SELECT ZIP FROM CustomersWHEREState = ''KY'' GROUP BY ZIP
SELECT ZIP,Count(ZIP) AS CustomersByZIP FROM Customers GROUP BY ZIP HAVING Count(ZIP) = 1
SELECT OrderID,Sum(Cost * Quantity) AS OrderTotal FROM Orders GROUP BY OrderID
SELECT Customer,OrderNumber,Sum(Cost * Quantity) AS OrderTotal FROM Orders GROUP BY Customer,OrderNumber WITH ROLLUP
SELECT Customer,OrderNumber WITH CUBE
-----------------------------------
当CUBE的结果令人迷惑时(它经常是这样),可以添加一个GROUPING函数,如下所示:

SELECT GROUPING(Customer),OrderNumber WITH CUBE

结果中每行包含两个额外的值:
值1表示左边的值是一个统计值,是ROLLUP或CUBE的操作符。
值0表示左边的值是一条由最初的GROUP BY语句产生的详细记录。
----------------
SELECT region,SUM(population),SUM(area)FROM bbc GROUP BY region HAVING SUM(area)>1000000

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

Select ? ?
? 课程名,?
? [成绩>=85]=SUM(Case ? When ? 成绩>=85 ? Then ? 1 ? Else ? 0 ? End) ?,?
? [85>成绩>70]=SUM(Case ? When ? 成绩>=70 ? And ? 成绩<85 ? Then ? 1 ? Else ? 0 ? End) ?,?
? [成绩<60]=SUM(Case ? When ? 成绩<60 ? Then ? 1 ? Else ? 0 ? End) ?,?
? 总人数=Count(1) ?
? from ? TableName ?
? Group ? By ? 课程名 ?
? Order ? By ? 课程名

----------------分组分段统计-----------------------

select
??? t.fromaccountid,
??? onglogtimes=sum(case when t.logtimes1>0 then 1 else 0 end),
??? twologtimes=sum(case when t.logtimes2=2 then 1 else 0 end),
??? regnum???? =sum(t.regStatus),
??? t.regdate
from
(select
??????? a.fromaccountid,
??????? count(1) as logtimes1,???????????????????????????????????????????????????????? --当日有登录记录的统计
??????? sum(case when datediff(mm,regdate,datetime)=0 then 1 else 0 end) as logtimes2,? --在注册当月登录的统计
??????? max(case when datediff(dd,datetime)=0 then 1 else 0 end) as regStatus,? --当日为注册操作的统计
??????? convert(char(10),a.regdate,120) as regdate
???? from
???????? vgameuser a,loginlog b
???? where
???????? a.accountid=b.playerid
???? group by
???????? a.fromaccountid,convert(char(10),120))t
group by
??? t.fromaccountid,t.regdate

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读