常用判断
sa/Cortland1234
库是否存在
if exists(select * from master..sysdatabases where name=N'库名')
print 'exists'
else
print 'not exists'
---------------
-- 判断要创建的表名是否存在
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[表名]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
print 'exists'
-- 删除表
--drop table [dbo].[表名]
GO
---------------
-----列是否存在
IF COL_LENGTH( '表名','列名') IS NULL
PRINT 'not exists'
ELSE
PRINT 'exists'
alter table 表名 drop constraint 默认值名称
go
alter table 表名 drop column 列名
go
-----
--判断要创建临时表是否存在
If Object_Id('Tempdb.dbo.#Test') Is Not Null
Begin
print '存在'
End
Else
Begin
print '不存在'
End
---------------
-- 判断要创建的存储过程名是否存在
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[存储过程名]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
-- 删除存储过程
drop procedure [dbo].[存储过程名]
GO
---------------
-- 判断要创建的视图名是否存在
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[视图名]') and OBJECTPROPERTY(id, N'IsView') = 1)
-- 删除视图
drop view [dbo].[视图名]
GO
---------------
-- 判断要创建的函数名是否存在
if exists (select * from sysobjects where xtype='fn' and name='函数名')
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[函数名]') and xtype in (N'FN', N'IF', N'TF'))
-- 删除函数
drop function [dbo].[函数名]
GO
if col_length('表名', '列名') is null
print '不存在'
select 1 from sysobjects where id in (select id from syscolumns where name='列名') and name='表名'
1、判断是否存在addOneArticle这个存储过程
if Exists(select name from sysobjects where NAME = 'addOneArticle' and type='P')
drop procedure addOneArticle
2、判断是否存在countAr这个触发器
if exists(select * from dbo.sysobjects where id = object_id(N'[dbo].[countAr]') and OBJECTPROPERTY(id, N'IsTrigger') = 1)
drop trigger countAr
3、判断是否存在View_1这个视图
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = N'View_1')
DROP View View_1
4、判断是否存在USER_Fun这个用户函数
(注意此处的type 有两种,分别是'TF'-Table-valued Function 表值函数 或'FN'-Scalar-valued Function 标量值函数)
if exists(select * from dbo.sysobjects where id = object_id(N'[dbo].[USER_Fun]') and (type = 'FN' or type = 'TF'))
DROP FUNCTION USER_Fun
5、判断表'Tb'是否存在
if (exists (SELECT * FROM dbo.sysobjects where id = object_id(N'Tb')and OBJECTPROPERTY(id, N'IsUserTable') = 1))
DROP TABLE Tb
6、判断数据库是否存在
if exists( select * from master.dbo.sysdatabases where dbid=db_ID( 'scbjdb' ) )
drop database scbjdb
else
print 'no exist scbjdb'
在SQL Server Management Studio 用WINDOWS连接的情况下改实列的“属性”中“安全性”
选中WINDOWS及SQL验证,再重起SQL服务器后,新建查询,执行下面代码
一、
ALTER LOGIN sa ENABLE
GO
ALTER LOGIN sa WITH PASSWORD = 'password'
GO
二、
ALTER LOGIN [sa]
WITH PASSWORD = N'NewPassword' --不用提供旧密码
泛型存储过程(分页):
--创建通用分页存储过程,默认asc
create PROCEDURE [dbo].[sp_All_Pager]
@tblName nvarchar(255),--表名,不可空
@fldOrderName nvarchar(255),--主键字段(排序用),,不可空
@fldNames nvarchar(1000)='*',--字段列表(默认所有字段)
@orderType bit =0,--排序类型,非0则降序(默认升序)
@pageIndex int=1,--页码
@pageSize int =20,--页大小
@strWhere nvarchar(1500)='',--查询条件,不带where
@limitCount int =5000000, --限制最多取5000000条数据
@totalCount int output --总记录数
AS
BEGIN
SET NOCOUNT ON;
DECLARE @strSQL NVARCHAR(4000)--主语句
DECLARE @strTable NVARCHAR(500)--主查询临时表
DECLARE @strOrderSQL NVARCHAR(1000)--总数查询语句
DECLARE @strOutParam NVARCHAR(500)--输出参数
DECLARE @strTmp NVARCHAR(255)--临时分页字句 max 和min
DECLARE @strOrder NVARCHAR(255)--排序参数
--设置排序
IF(@orderType != 0)
BEGIN
SET @strTmp = ' <(SELECT MIN '
SET @strOrder = ' ORDER BY [' + @fldOrderName +'] DESC'
END
ELSE
BEGIN
SET @strTmp = ' >(select max '
SET @strOrder = ' ORDER BY [' + @fldOrderName +'] ASC'
END
--设置主查询临时表
IF(@strWhere!='')
SET @strTable='(SELECT TOP '+STR(@limitCount)+' '+@fldNames+' FROM ['+@tblName+'] WHERE '+@strWhere+') AS tmpTable'
ELSE
SET @strTable='(SELECT TOP '+STR(@limitCount)+' '+@fldNames+' FROM ['+@tblName+']) AS tmpTable'
--设置总数查询语句和主语句
SET @strOrderSQL=N'SELECT @totalCountOut=COUNT(1) FROM '+@strTable
SET @strOutParam=N'@totalCountOut INT OUTPUT'
IF (@pageIndex = 1)
SET @strSQL = 'SELECT TOP ' + str(@pageSize) +' '+@fldNames+ ' FROM ' + @strTable + @strOrder
ELSE
SET @strSQL = 'SELECT TOP ' + str(@PageSize) +' '+@fldNames+ ' FROM ' + @strTable + ' WHERE [' + @fldOrderName + ']' + @strTmp + '(['+ @fldOrderName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['+ @fldOrderName + '] from ' + @strTable + @strOrder + ') as tblTmp) ' + @strOrder
EXEC sp_executesql @strOrderSQL,@strOutParam,@totalCountOut=@totalCount OUTPUT
EXEC sp_executesql @strSQL
END
安装SQL问题:
在安装sql server2008 时,检查是否需要挂起计算机重新启动。挂起重新启动会导致安装程序失败。并且尝试了重新启动;在"开始"-"运行"中输入regedit,进入注册表编辑器,依次查找 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager,但是找不到“PendingFileRenameOperations”值,不过在其他地方找到该值,并删除。
主键:实体完整性约束
外键:参照完整性约束
check:用户定义完整性约束
/*用户定义完整性约束*/
create table Student
(
Sno char(9),
Sname varchar(8) not null,
Ssex char(2) check( Ssex in ('男','女')),
Sage smallint
);
/*删除表*/
drop table test;
/*创建表*/
create table test
(
testid int identity(1,1),
testyname varchar(20),
constraint PK_test primary key clustered(testid desc)
)
/*删除主键*/
alter table test drop constraint PK_test;
/*新增主键*/
alter table test add constraint PK_test primary key clustered(testid desc);
/*新增列*/
alter table test add testtt nvarchar(20) not null;
/*修改列*/
alter table test alter column testtt nvarchar(10) not null;
/*删除列*/
alter table test drop column testtt;
create table test2
(
test2id int identity(1,1),
test2name varchar(20),
constraint PK_test2 primary key clustered(test2id desc)
)
alter table test2 add testid int not null;
/*新增外键*/
alter table test2 add constraint FK_test_test2 foreign key(testid) references test(testid)
on delete cascade
on update cascade;
/*删除外键*/
alter table test2 drop constraint FK_test_test2;
/*创建索引*/
unique--标明次此索引的每一个索引值只对应唯一的数据记录
cluster--表示要建立的索引是聚簇索引。聚簇索引指索引项的顺序与表中记录的物理顺序一致的索引组织。经常更新的列不宜建立聚簇索引。
在一个基本表中最多只能建立一个聚簇索引。
create index unique Stestname on test(testname);
/*删除索引*/
删除索引必须加上表明,不然报错。记得我们上学那会的书中就是错误的。O(∩_∩)O哈哈~
drop index test.Stestname;
--查询数据库中表数量
select count(xtype) as 自建表数量 from sysobjects where xtype= 'u '
select count(xtype) AS 系统表数量 from sysobjects where xtype= 's '
--查询数据库中表名称
select NAME as 自建表 from sysobjects where xtype= 'u '
select NAME AS 系统表 from sysobjects where xtype= 's '
1、查询SQL中的所有表: Select TABLE_NAME FROM 数据库名称.INFORMATION_SCHEMA.TABLES Where TABLE_TYPE='BASE TABLE' 执行之后,就可以看到数据库中所有属于自己建的表的名称2、查询SQL中所有表及列: Select dbo.sysobjects.name as Table_name, dbo.syscolumns.name AS Column_nameFROM dbo.syscolumns INNER JOIN dbo.sysobjects ON dbo.syscolumns.id = dbo.sysobjects.idWhere (dbo.sysobjects.xtype = 'u') AND (NOT (dbo.sysobjects.name LIKE 'dtproperties'))3、在Sql查询分析器,还有一个简单的查询方法: EXEC sp_MSforeachtable @command1="sp_spaceused '?'"执行完之后,就可以看到数据库中所有用户表的信息
SQL利用Case When Then多条件判断(转自菜菜)
CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
WHEN 条件3 THEN 结果3
WHEN 条件4 THEN 结果4
.........
WHEN 条件N THEN 结果N
ELSE 结果X
END
Case具有两种格式。简单Case函数和Case搜索函数。
--简单Case函数
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
--Case搜索函数
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END
例如:
SELECT id, name, cj, (CASE WHEN cj < 60 THEN '不及格' WHEN cj BETWEEN 60 AND 90 THEN '良好' WHEN cj > 90 THEN '优秀' END) AS 状态
FROM stud
这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。
还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。
--比如说,下面这段SQL,你永远无法得到“第二类”这个结果
CASE WHEN col_1 IN ( 'a', 'b') THEN '第一类'
WHEN col_1 IN ('a') THEN '第二类'
ELSE'其他' END
下面我们来看一下,使用Case函数都能做些什么事情。
一,已知数据按照另外一种方式进行分组,分析。
有如下数据:(为了看得更清楚,我并没有使用国家代码,而是直接用国家名作为Primary Key)
国家(country) 人口(population)
中国 600
美国 100
加拿大 100
英国 200
法国 300
日本 250
德国 200
墨西哥 50
印度 250
根据这个国家人口数据,统计亚洲和北美洲的人口数量。应该得到下面这个结果。
洲 人口
亚洲 1100
北美洲 250
其他 700
想要解决这个问题,你会怎么做?生成一个带有洲Code的View,是一个解决方法,但是这样很难动态的改变统计的方式。
如果使用Case函数,SQL代码如下:
SELECT SUM(population),
CASE country
WHEN '中国' THEN '亚洲'
WHEN '印度' THEN '亚洲'
WHEN '日本' THEN '亚洲'
WHEN '美国' THEN '北美洲'
WHEN '加拿大' THEN '北美洲'
WHEN '墨西哥' THEN '北美洲'
ELSE '其他' END
FROM Table_A
GROUP BY CASE country
WHEN '中国' THEN '亚洲'
WHEN '印度' THEN '亚洲'
WHEN '日本' THEN '亚洲'
WHEN '美国' THEN '北美洲'
WHEN '加拿大' THEN '北美洲'
WHEN '墨西哥' THEN '北美洲'
ELSE '其他' END;
同样的,我们也可以用这个方法来判断工资的等级,并统计每一等级的人数。SQL代码如下;
SELECT
CASE WHEN salary <= 500 THEN '1'
WHEN salary > 500 AND salary <= 600 THEN '2'
WHEN salary > 600 AND salary <= 800 THEN '3'
WHEN salary > 800 AND salary <= 1000 THEN '4'
ELSE NULL END salary_class,
COUNT(*)
FROM Table_A
GROUP BY
CASE WHEN salary <= 500 THEN '1'
WHEN salary > 500 AND salary <= 600 THEN '2'
WHEN salary > 600 AND salary <= 800 THEN '3'
WHEN salary > 800 AND salary <= 1000 THEN '4'
ELSE NULL END;
二,用一个SQL语句完成不同条件的分组。
有如下数据
国家(country) 性别(sex) 人口(population)
中国 1 340
中国 2 260
美国 1 45
美国 2 55
加拿大 1 51
加拿大 2 49
英国 1 40
英国 2 60
按照国家和性别进行分组,得出结果如下
国家 男 女
中国 340 260
美国 45 55
加拿大 51 49
英国 40 60
普通情况下,用UNION也可以实现用一条语句进行查询。但是那样增加消耗(两个Select部分),而且SQL语句会比较长。
下面是一个是用Case函数来完成这个功能的例子
SELECT country,
SUM( CASE WHEN sex = '1' THEN
population ELSE 0 END), --男性人口
SUM( CASE WHEN sex = '2' THEN
population ELSE 0 END) --女性人口
FROM Table_A
GROUP BY country;
这样我们使用Select,完成对二维表的输出形式,充分显示了Case函数的强大。
三,在Check中使用Case函数。
在Check中使用Case函数在很多情况下都是非常不错的解决方法。可能有很多人根本就不用Check,那么我建议你在看过下面的例子之后也尝试一下在SQL中使用Check。
下面我们来举个例子
公司A,这个公司有个规定,女职员的工资必须高于1000块。如果用Check和Case来表现的话,如下所示
CONSTRAINT check_salary CHECK
( CASE WHEN sex = '2'
THEN CASE WHEN salary > 1000
THEN 1 ELSE 0 END
ELSE 1 END = 1 )
如果单纯使用Check,如下所示
CONSTRAINT check_salary CHECK
( sex = '2' AND salary > 1000 )
女职员的条件倒是符合了,男职员就无法输入了。
Select top 100 State,JoinState,
(case when State=1 and Joinstate=0 then 2 when State=1 and JoinState=1 then 1 else 0 end) as usestate from UserInfo
(2)
select ID,Username,namer=(case when(score<='50') then '实习'
when(score>'50' and score<='500' ) then '赤脚医生'
when(score>'500' and score<='1000' ) then '村卫生员'
when(score>'1000' and score<='1500' ) then '乡卫生员'
when(score>'1500' and score<='2000' ) then '镇卫生员'
when(score>'2000' and score<='3000' ) then '医师'
when(score>'3000' and score<='5000' ) then '主治医师'
when(score>'5000' and score<='10000' ) then '副主任医师'
when(score>'10000' and score<='20000' ) then '主任医师'
when(score>'20000' and score<='50000' ) then '健康大使'
else '健康大使' end ), (SELECT count(id)
FROM jk01_YiWen_Question
WHERE UserID = dbo.jk01_Member.ID) as questionnum
from jk01_Member