SQL大全(查询分析器快捷鍵,Sysproperties系统表,syscolumns系统表,union,表结构修改,临时表,加一个自动增长列,函数,游标,关联其它表修改,直接调用存储过程,T远程连接专用sql)
查询分析器快捷鍵
Ctrl-Shift-C:注释
Ctrl-Shift-R:移除注释
多行注释的时候很管用。不用光标移来移去定位首尾,然后用/* */了。
Ctrl-Shift-L:转为小写
Ctrl-Shift-U:转为大写
Sysproperties系统表
这个表是存储列描述的
当用表设计器设计表的时候可以添加所谓的描述说明,这个表就是拿来存储这些信息的。
如果表没有信息是因为表定义都没有添加过描述说明,可以换个库看看,比如master数据库;或者手动添加1,2个字段的说明,就可以查到纪录
syscolumns系统表
COLUMNPROPERTY(id, Name,'IsIdentity')方法可能只对syscolumns表有用,而且前面两个参数是固定的
根据数据库的数字类型长度计算出它的最大长度
以int为例:
一个字节是8位,所以最少是8位,INT是4个字节,所以是32位,这32位指的是二进制的。32位的最大二进制是11111……一直到32位 所以INT的最大值应该是231+230 +……+21+20=232
结合两条查询的记录 union
(第一个select 后跟的列数应该和第二个select后的列数相同)
方法一:
select distinct ' ',' ' from CUR_EMS3_IMG
(在原数据前插入一条空的记录 如果去掉distinct结果将插入与原数据记录行数相同的记录)
union all
select id,g_name from CUR_EMS3_IMG
方法二:
select ' ',' ' from CUR_EMS3_IMG (在原数据前插入一条空的记录)
union
select id,g_name from CUR_EMS3_IMG
方法三:
select ' ',' ' (在原数据前插入一条空的记录)
union
select id,g_name from CUR_EMS3_IMG
在查询分析器中给表加一列(加字段)
Alter table 表名 add 新增字段名 字段类型
把数据插入到临时表。
select * into 临时表名 from 数据源
向临时表中加一个自动增长列
select identity(int,1,1) s,* into #test from test
函数
ISNULL:
Isnull(列名,替换的值);
用法:select id,isnull(name,’测试’) form test;
用法二:如果想查出name 是为空值的记录,只能用这种方法select * from test where isnull(name,’ ’)=’ ’;
CHARINDEX函数返回字符或者字符串在另一个字符串中的起始位置。
CHARINDEX函数调用方法如下:
CHARINDEX ( expression1 , expression2 [ , start_location ] )
例:CHARINDEX(‘,’,test)在test字段中查询有没有逗号
Expression1是要到expression2中寻找的字符口串,start_location是CHARINDEX函数开始在expression2中找expression1的位置。
Substring:截取字段
substring(Entry_ID,9,1) 第一个参数是字段,第二个参数从第几位开始截取,第三个是截取多少位。
ISNUMERIC()判断是否为数值
ISNUMERIC(Entry_ID)
替换回车
select replace(testID,char(13)+char(10),'') testID,* from test
行到最后一次指定字符的位置
PATINDEX('%,%', @new_list_no) --得到第一次出现','的位置
datalength(isnull(G_NAME,'')) 检查汉字和字符的长度(汉字为两个字符字母为单字符)
游标
游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。
一、 游标种类
MS SQL SERVER 支持三种类型的游标:Transact_SQL 游标,API 服务器游标和客户游标。
(1) Transact_SQL 游标
Transact_SQL 游标是由DECLARE CURSOR 语法定义、主要用在Transact_SQL 脚本、存储过程和触发器中。Transact_SQL 游标主要用在服务器上,由从客户端发送给服务器的Transact_SQL 语句或是批处理、存储过程、触发器中的Transact_SQL 进行管理。 Transact_SQL 游标不支持提取数据块或多行数据。
(2) API 游标
API 游标支持在OLE DB, ODBC 以及DB_library 中使用游标函数,主要用在服务器上。每一次客户端应用程序调用API 游标函数,MS SQL SEVER 的OLE DB 提供者、ODBC驱动器或DB_library 的动态链接库(DLL) 都会将这些客户请求传送给服务器以对API游标进行处理。
(3) 客户游标
客户游标主要是当在客户机上缓存结果集时才使用。在客户游标中,有一个缺省的结果集被用来在客户机上缓存整个结果集。客户游标仅支持静态游标而非动态游标。由于服务器游标并不支持所有的Transact-SQL 语句或批处理,所以客户游标常常仅被用作服务器游标的辅助。因为在一般情况下,服务器游标能支持绝大多数的游标操作。
由于API 游标和Transact-SQL 游标使用在服务器端,所以被称为服务器游标,也被称为后台游标,而客户端游标被称为前台游标。在本章中我们主要讲述服务器(后台)游标。
二、 游标操作
使用游标有四种基本的步骤:声明游标、打开游标、提取数据、关闭游标。
声明游标
象使用其它类型的变量一样,使用一个游标之前,首先应当声明它。游标的声明包括两个部分:游标的名称;这个游标所用到的SQL语句。如要声明一个叫作Cus-tomerCursor的游标用以查询地址在北京的客户的姓名、帐号及其余额,您可以编写如下代码:
例1:
DECLARE CustomerCursor CURSOR FOR
SELECT acct_no,name,balance
FROM customer
WHERE province="北京";
例2:
--清除所有记录
truncate table info
declare @i int
set @i=1
while @i<1000000
begin
insert into info values('Justin'+str(@i),'深圳'+str(@i))
set @i=@i+1
end
例3:
declare @EntID varchar(18) --定义报关单号
declare @ListID varchar(36) --定义清单唯一号
declare curEnt cursor FOR --定义游标
SELECT AVS_ENTRY_HEAD.ENTRY_ID, AVS_SUBBILL_HEAD.ID FROM AVS_ENTRY_HEAD INNER JOIN AVS_SUBBILL_HEAD ON AVS_ENTRY_HEAD.SEQ_NO = AVS_SUBBILL_HEAD.LIST_NO
open curEnt --打开游标
FETCH NEXT FROM curEnt into @EntID,@ListID
WHILE @@FETCH_STATUS = 0 --固定写法
BEGIN
update AVS_SUBBILL_HEAD set ENT_NO=@EntID where [ID]=@ListID --更新数据
FETCH NEXT FROM curEnt into @EntID,@ListID
END
CLOSE curEnt --关闭游标
DEALLOCATE curEnt
在游标的声明中有一点值得注意的是,如同其它变量的声明一样,声明游标的这一段代码行是不执行的,您不能将debug时的断点设在这一代码行上,也不能用IF...END IF语句来声明两个同名的游标,如下列的代码就是错误的。
IF Is_prov="北京"THEN
DECLARE CustomerCursor CURSOR FOR
SELECT acct_no,name,balance
FROM customer
WHERE province="北京";
ELSE
DECLARE CustomerCursor CURSOR FOR
SELECT acct_no,name,balance
FROM customer
WHERE province〈〉"北京";
三表连接:
Student 学生表
Subject 成绩对应的ID
Grade 成绩表
select s.stuid,s.name,b.subjectName,g.grade from student s left join grade g on s.stuid=g.stuid left join subject b on g.subjectId=b.subjectId
newid()获取唯一ID
getdate()获取当前时间
substring()截取字符
新增字段:
alter table 表名 add 字段 数据类型
修改表字段数据类型:
alter table TMP_TR_IMG
alter column G_NAME varchar(200)
修改字段名
exec sp_rename '表名.旧列名','新列名'
删除字段
alter table CIQ_Company drop column LimitGood
增加默认值
alter table OUT_APPLY_BILL_HEAD add default (getdate()) for insertDatetime
关联其它表修改
UPDATE TMP_DCR_Import_Export_Gather
SET FLAG=1,REMARK='项号必须存在于归并后料件中'
FROM TMP_DCR_Import_Export_Gather A LEFT JOIN CUR_EMS3_IMG B
ON A.EMS_NO = B.EMS_NO
AND convert(int,A.G_NO) = B.G_NO
WHERE A.G_MARK='3' AND A.FLAG = 0
AND B.COP_G_NO IS NULL
加主键(组合键的话就直接在括号里加多列)
ALTER TABLE CompInfo ADD PRIMARY KEY (列名)
存储过程加传出参数时直接给个空字符。
exec THEORY_RESULT_VIEW_TMP_CHK 'K23275E00001', '3', 'K23275E00001_1',''
SET IDENTITY_INSERT (当表有自动增长行时不可插入)
允许将显式值插入表的标识列中。
语法
SET IDENTITY_INSERT [ database.[ owner.] ] { table } { ON | OFF }
参数
database 是指定的表所驻留的数据库名称。
Owner
是表所有者的名称。
table
是含有标识列的表名。
让日期只显示年月日。
SELECT convert(varchar(10),D_DATE,120) from COMP_ENTRY_HEAD
T人专用sql(把远程登录的人T掉 此sql必须连上你要远程连接的那台机器执行,如要连接A机器,就连A的sql T人)
xp_cmdshell 'query user'
xp_cmdshell 'logoff 1'
修改一个表的值是从另一个表取的
update A set A.ENT_NO=B.ENTRY_ID
FROM B INNER JOIN A ON
B.SEQ_NO = A.LIST_NO