ITPub博客

首页 > Linux操作系统 > Linux操作系统 > SQL SERVER积累(连载二之SQL2000高级编程学习笔记)

SQL SERVER积累(连载二之SQL2000高级编程学习笔记)

原创 Linux操作系统 作者:linguojin 时间:2009-11-18 12:38:11 0 删除 编辑

 

-----------全局唯一标识值
create table lintest1215(id uniqueidentifier not null default newid(),name int)
insert into lintest1215(name) select 1
insert into lintest1215(name) select 3
select * from lintest1215
go
drop table lintest1215


  SQLServer2000开发者指南  
  http://www.pdown.net/download.asp?downid=2&id=1035  
   
  sqlserver   2000   程序员指南  
  http://www.pdown.net/download.asp?downid=2&id=143
-------------------------------------------------------------------------------------------------------------

2009-12-09
更新锁:可以防止其他进程读取并放置共享锁于改记录上,直到最早的进程完成改操作。
select * from tablename(updlock)

-----------------------------------------------------------------------------------------------------------
2009-1208

create table tb1209(id int)
insert into lindboption
exec('select 1')     --插入数据到表中
也可以在EXEC后面跟存储过程,但是要求存储过程返回的表列与原表对应。
exec [procedurename]
但是有种情况要注意:如果你试图以这种方式来收集来自DBCC命令的结果集,SQL SERVER就会返回一个错误,但是你可以将DBCC语句封装到一个串种,并通过EXEC 来执行它。如:
insert into tablename
exec ('DBCC SQLPERF(LOGSPACE)')    --这个语句是查询指定数据库里日志空间使用的百分比

---------------------------------
execute与sp_executesql区别:execute使用时整个批处理每次必须以一个串的形式来汇编。如果使用sp_executesql,则改批处理只会在第一此执行时被汇编,所有随后的执行都可以使用同一个串,并提供一个额外的参数集合。
-----------------------------------------------------------------------------------------------------------

2009-12-05

sp_executesql语句的使用
create table nt(id int,name int)
insert into nt select 1,1

exec sp_executesql @stmt=N'select * from nt where id=@id and name=@name',@parms=N'@id

int,@name int',@id=1,@name=1
--上面例子中如果前面语句使用参数,那么后面的值必须也带参数名。
--或者
exec sp_executesql N'select * from nt where id=@id and name=@name',N'@id int,@name

int',@id=1,@name=1 
--上面例子中后面值的参数名可以省略
go
drop table nt
------------
use lin
exec('use test select * from newtable')
select * from newtable  
--上面语句会出现错误,不能在其他批处理中使用同一个数据库环境。也不能在其他批处理中使用其他

批处理定义的变量,如下:
declare @a varchar(100)
set @a='a'
exec('select * from @a'),

----------
instead of 触发器是在其他触发器之前执行,并且一个对象只能有一个instead of触发器。
sp_helptrigger 'tablename'   可以列出与表有联系的所有触发器。
禁止触发器   不用删除触发器也可以暂时地禁止和启动触发器。
alter table order disable trigger trigger_name
-----------------------------------------------------------------------------------------------------------
2009-11-26

對象作用域:
alter table lin11241 add  name varchar(10) null
select id,name from lin11241
這種情況下會提示name列不存在,有兩種解決方法:1.在alter與select語句之間用go分開,因為一些

DDL語句可以和其他命令存在于同一個批處理中,但必須記住只有批處理完成后才能訪問結果對象。2.將

select語句改成select * from lin11241。
同樣情況,帶有EXEC的這種語句:
alter table lin11241 add  name varchar(10) null
select id,name from lin11241 也會出錯。
----------------------------------------------
set ansi_nulls on   --当某字段为空时,不能用=null来查询出结果,诺是想可以用=null实现查询,

则可以将on设置为off。
-----------------------------------------------
set nocount on
select datalength('啊啊a') 
select len('啊啊a')
select str(1564654.66,8,1)
select replicate('g',5)
select round(3.1,0)   --取指定精度的四舍五入值
select floor(3.1)     --取得小于或等于该数的最大整数
select ceiling(3.1)   --取得大于或等于该数的最小整数
select rand(3)     --取得0到1之间的随机数
select power(4.6,3)  --指定数的N次幂
select @@servicename

openrowset函數 跟openquery函數相似,區別在於openrowset函數是用來連接一個沒有作為鏈接伺服器

註冊的伺服器。因此開發人員必須聽哦你是提供連接參數和要使用得語句。而openquery函數是從鏈接伺

服器上返回記錄。
 
----------------------------------------------
存儲過程中最好加上return語句,可以控制語句的返回 。還是就是用於GOTO語句中

-----------------------------------------------------------------------------------------------------------
2009-11-25
isdate()
isnumeric()
datalength()
binary_checksum(parm1,parm2...可以有多个参数)  --2进制校验,可以用来比较表各列的检验和是否发生变化
-----------------------------------
sql_variant_property(column,'property')
example:sql_variant_property(name,'basetype')
参数:basetype(基本类型)
precision(精度)
scale(标度)
totalbytes(字节总数)
collation(校对)
MaxLength(最大长度)
nullif(expression1,expression2)  如果两哥表达式一样,返回null,如果不等就返回第一哥表达式的值。因为在统计平均值时值是0是有被考虑进去的,所以有时候为了不考虑进去,用此函数将列转为null,这种情况下可以不考虑原来的0值,因为计算时是不考虑Null的。

-----------------------------------------------------------------------------------------------------------
2009-11-24
@@error的使用:
create table a1(id int primary key,name int)
insert into a1 select 1,1
insert into a1 select 2,1

go
create proc lintest
as
begin
    declare @errcode int
    insert into a1 select 1,1
    set @errcode = @@error
    if @errcode <>0    --如何得到此error的值
        select @errcode as errcode
end
go
exec lintest
go
drop table a1
drop procedure lintest
/*(1 行受影响)

(1 行受影响)
消息 2627,级别 14,状态 1,过程 lintest,第 5 行
违反了 PRIMARY KEY 约束 'PK__a1__5165187F'。不能在对象 'dbo.a1' 中插入重复键。
语句已终止。
errcode
-----------
2627

(1 行受影响)*/
-----------
備註:只有將query analysies輸出格式改為文本的情況下才能輸出錯誤代碼,否則只有錯誤描述。
-----------

-------------------------------------------------------------------------------
set nocount on
select datalength('啊啊a') 
select len('啊啊a')
select str(1564654.66,8,1)
select replicate('g',5)
select round(3.1,0)   --取指定精度的四舍五入值
select floor(3.1)     --取得小于或等于该数的最大整数
select ceiling(3.1)   --取得大于或等于该数的最小整数
select rand(3)     --取得0到1之间的随机数
select power(4.6,3)  --指定数的N次幂
select @@servicename

openrowset函數 跟openquery函數相似,區別在於openrowset函數是用來連接一個沒有作為鏈接伺服器註冊的伺服器。因此開發人員必須聽哦你是提供連接參數和要使用得語句。而openquery函數是從鏈接伺服器上返回記錄。
 
2009-11-25
事务处理:
在存储过程种我们经常会用到事务的处理,一个批处理中的执行语句只要一个有出错感觉好像就全部回滚,这种情况下用begin tran与commit tran感觉起不到作用。不知道能否举个简单例子来体现下用处?
函数或者存储过程中不能用不确定函数,比如newid()和getdate()等。
-----------------------------------------------------------------------------------------------------------
2009-11-24
對象作用域:
alter table lin11241 add  name varchar(10) null
select id,name from lin11241
這種情況下會提示name列不存在,有兩種解決方法:1.在alter與select語句之間用go分開,因為一些DDL語句可以和其他命令存在于同一個批處理中,但必須記住只有批處理完成后才能訪問結果對象。2.將select語句改成select * from lin11241。
同樣情況,帶有EXEC的這種語句:
alter table lin11241 add  name varchar(10) null
select id,name from lin11241 也會出錯。
----------------------------------------------
set ansi_nulls on   --当某字段为空时,不能用=null来查询出结果,诺是想可以用=null实现查询,则可以将on设置为off。
-----------------------------------------------
set nocount on
select datalength('啊啊a') 
select len('啊啊a')
select str(1564654.66,8,1)
select replicate('g',5)
select round(3.1,0)   --取指定精度的四舍五入值
select floor(3.1)     --取得小于或等于该数的最大整数
select ceiling(3.1)   --取得大于或等于该数的最小整数
select rand(3)     --取得0到1之间的随机数
select power(4.6,3)  --指定数的N次幂
select @@servicename

openrowset函數 跟openquery函數相似,區別在於openrowset函數是用來連接一個沒有作為鏈接伺服器註冊的伺服器。因此開發人員必須聽哦你是提供連接參數和要使用得語句。而openquery函數是從鏈接伺服器上返回記錄。
 
----------------------------------------------
存儲過程中最好加上return語句,可以控制語句的返回 。還是就是用於GOTO語句中

-------------------------------------------------------------------------------------------------------------
2009-11-18

create table lin1118(id int identity(3,1),name varchar(100))
insert into lin1118 select 'a1'
insert into lin1118 select 'a2'
select @@identity,ident_seed('lin1118'),ident_incr('lin1118')
go
drop table lin1118
/*(所影响的行数为 1 行)
上面例子分别取得表当前种子的值,种子的初始值,种子的增值。
                                                                                                                          
---------------------
4   3    1
----------------------
*/

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

select $123456789.90,convert(varchar,$123456789.90,0),convert(varchar,$123456789.90,1),convert(varchar,$123456789.90,2)
/*
--result
------------------------
123456789.9000        123456789.90                   123,456,789.90                 123456789.9000
---------------------
注释:
convert(varchar,$货币值,参数(0/1/2))
0 代表 保留两位小数,每三位数字之间无逗号
1 代表 保留两位小数,每三位数字之间有逗号
2 代表 保留四位小数,每三位数字之间无逗号
*/
--------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------
2009-11-17
delete   不会重置表计数(identity)
truncate  会重置表计数
---------------------------
select coalesce(col1,col2,col3)   此函数返回第一个非空表达式的值
如:select coalesce(20,10,'g')  返回结果为20

binary_checksum(column1,column2,column3...)   查询数列的二进制校验,可以通过此比较该几列是否更新过,对大小写敏感。默认安装系

统时是忽略大小写,所以此函数不能工作。
--------------------------------------------------------------

isdate(expression)
isnumeric(expression)
datalength(expression)   --返回字节数

select @count=(*),@begin=1,@char='' from tablename   --在这语句中可以实现3个字符串的赋值,以便在循环中可以用到起始数,终止数

,以及变量字符串。


-----------------------------------------------------------------------------------------------------------
2009-11-12

SELECT *, MyUser.MyScalarFunction()   --当调用标量用户定义函数时,必须提供至少由两部分组成的名称:
FROM MyTable

可以使用一个部分构成的名称调用表值函数:

SELECT *
FROM MyTableFunction()

然而,当调用返回表的 SQL Server 内置函数时,必须将前缀 :: 添加至函数名:

SELECT * FROM ::fn_helpcollations()


-------------------------------------
近似值与精确值?
--------------------------------------------------------------
---------------------
MSdtc服務:用來管理多個伺服器之間的兩步提交事務,這樣來保證再不同伺服器上更新數據時可以成功的完成。

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


-----------------------------------------------------------------------------------------------------------
2009-11-03  存储过程返回值的获取
---------------------
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

ALTER  proc lin11031
@a1 int

as
select 1
return (3)

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
declare @b int
exec @b=lin11031 2
select  @b
------------------------------------------------------
         
1

---------
3

 

-----------------------------------------------------------------------------------------------------------
2009-11-05
存储过程加密破解

系统存储过程,查询数据库空间使用情况:sp_spaceused
-----------------------------------------------------------------------------------------------------------
2009-11-06
在删除存储过程以前最好是先释放高速缓存的内容,有两种方式:
1. dbcc freeproccache
2.重新启动服务器

-----
exec sp_depends objectname 显示该对象所依赖的对象和依赖此对象的对象

存储过程的最大值(见书3.4章)

删除存储过程所依赖的对象后必须重新执行该语法才可生效。
------
三种存储过程的重新编译方法:
1。exec sp_recompile procname
2. exec procname with recompile  执行的时候重新编译
3. 另外一种是在编码时加入with recompile

 

 

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/10054891/viewspace-619948/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 继续组包奋斗
请登录后发表评论 登录
全部评论

注册时间:2009-11-08

  • 博文量
    25
  • 访问量
    30462