Archive for ‘MS SQL’ Category
表结构:
演示数据如下:
写法一:
CREATE PROCEDURE UP_S_LocationTreeByLocationID
@LocationID VARCHAR(36)
AS
BEGIN
SET NOCOUNT ON
DECLARE @Level INT
DECLARE @Temp TABLE(LocationID VARCHAR(36),ParentID VARCHAR(36),iLevel INT,LocationNm VARCHAR(40))
DECLARE @Stack TABLE(LocationID VARCHAR(36),iLevel INT)
SET @Level = 1
INSERT INTO @Temp
SELECT LocationID,
ParentLocationID,
@Level,
LocationNm
FROM tblLocation
WHERE LocationID = @LocationID
INSERT INTO @Stack VALUES(@LocationID,@Level)
WHILE @Level > 0
BEGIN
IF EXISTS(SELECT 1 FROM @Stack WHERE iLevel = @Level)
BEGIN
SELECT @LocationID = LocationID
FROM @Stack
WHERE iLevel = @Level
PRINT @LocationID
[...]
好久没来更新blog了,主要是最近比较忙,忙的结果是回到家什么都不想做,什么都没念头,只想倒头就睡,当然这不过是骗人的借口而已,呵呵…看来要坚持做某件事情还真的很难,就象前段时间想每天坚持学点英语,结果没几天就不了了之了:)
上次美国佬要做数据同步,数据量很小,当时想用DTS做,但美国跟苏州这里不能直接相连,做数据库备份又太大,而其所需的数据又不多,考虑再三,如果能自动生成数据插入语句,然后将生成的文件发给美国,那边执行就可以了,想法很好,但怎么实施呢?在 oracle 里面可以通过logminer来实现,在Sybase里有unload可以实现,在sql server里好象没有专门的工具或命令可实现,怎么办呢,只能自己写脚本实现了…脚本如下:
if exists (select * from dbo.sysobjects where id = object_id(N’[dbo].[generate_insert_statement]‘) and OBJECTPROPERTY(id, N’IsProcedure’) = 1)
drop procedure [dbo].[generate_insert_statement]
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS OFF
GO
CREATE PROCEDURE generate_insert_statement
@tablename nvarchar(128),
@dbname nvarchar(128),
@objowner nvarchar(128),
@collist varchar(8000)
AS
/*
–@tablename is table name which you want to export data
–@dbname is the database name
–@objowner is the table owner ,default is dbo
@collist is column list that [...]
前一天一朋友的SQL SERVER MSCS出现故障,一节点的SQL SERVER没办法Online,察看该节点OS的Event log,发现如下错误信息:
[sqsrvres] checkODBCConnectError: sqlstate = 01000; native error = 14; message = [Microsoft][ODBC SQL Server Driver][DBNETLIB]ConnectionOpen (PreLoginHandshake()).
[sqsrvres] ODBC sqldriverconnect failed
根据该错误信息,在google上查找,未果。打开MSCS管理工具,发现该节点上的其他Resource,如:Disk,IP Address,Network Name都是Online的,但就是跟sql有关的resource offline…初步估计是该节点的sql server有问题,试着将其切换至另一节点,发现可以online…这样似乎证实了刚才的判断…
既然是该节点的sql server有问题,那干脆将该节点的sql server程序文件重新安装一下,步骤如下:
1.将两边的Cluster service,sql server service停掉
2.为预防万一,将该节点的sql server文件夹改名备份
3.copy另一节点之sql server文件夹至本节点对应目录
4.将两边的cluster service 启动
结果更糟,两边的sql server service都无法起来了!
赶紧察看OS Event log,发现了新的error,如下:
[sqsrvres] checkODBCConnectError: sqlstate = 08001; native error = 14; message = [Microsoft][ODBC SQL Server Driver][DBNETLIB]Encryption not [...]
今天一个同事问我如何实现SELECT时实现输出系列号,比如:
ID NAME
———– ——————-
1 sysobjects
2 sysindexes
3 syscolumns
4 [...]
1.事务(Transaction):
事务是作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元必须有四个属性,称为 ACID
(原子性、一致性、隔离性和持久性)属性,只有这样才能成为一个事务。
原子性(Atomicty)
事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
一致性(Consistency)
事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事
务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链
表)都必须是正确的。
隔离性(Isolation)
由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状
态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看
中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使
数据结束时的状态与原始事务执行的状态相同。
持久性(Durability)
事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。
2.启动事务
在 Microsoft® SQL Server™ 中,可以按显式、自动提交或隐性模式启动事务。
显式事务
通过发出 BEGIN TRANSACTION 语句显式启动事务。
自动提交事务
这是 SQL Server 的默认模式。每个单独的 Transact-SQL 语句都在其完成后提交。不必指定任
何语句控制事务。
隐性事务
通过 API 函数或 Transact-SQL SET IMPLICIT_TRANSACTIONS ON 语句,将隐性事务模式设
置为打开。下一个语句自动启动一个新事务。当该事务完成时,再下一个 Transact-SQL 语句
又将启动一个新事务。
3.结束事务
可以使用 COMMIT 或 ROLLBACK 语句结束事务。
COMMIT
如果事务成功,则提交。COMMIT 语句保证事务的所有修改在数据库中都永久有效。COMMIT
语句还释放资源,如事务使用的锁。
ROLLBACK
如果事务中出现错误,或者用户决定取消事务,可回滚该事务。ROLLBACK 语句通过将数据返
回到它在事务开始时所处的状态,来恢复在该事务中所作的所有修改。ROLLBACK 还会释放由
事务占用的资源。
4.事务处理过程中的错误
如果服务器错误使事务无法成功完成,SQL Server 将自动回滚该事务,并释放该事务占用的所有
资源。如果客户端与 SQL Server 的网络连接中断了,那么当网络告知 SQL Server 该中断时,将
回滚该连接的所有未完成事务。如果客户端应用程序失败或客户计算机崩溃或重启,也会中断该连
接,而且当网络告知 SQL Server 该中断时,也会回滚所有未完成的连接。如果客户从该应用程序
注销,所有未完成的事务也会被回滚。
如果批处理中出现运行时语句错误(如违反约束),那么 SQL Server 中默认的行为将是只回滚产
生该错误的语句。可以使用 SET XACT_ABORT 语句改变该行为。在 SET XACT_ABORT ON 语句
执行之后,任何运行时语句错误都将导致当前事务自动回滚。编译错误(如语法错误)
不受 SET XACT_ABORT [...]
大家猜猜以下两个语句执行结果是否一样?
select * from aa a left outer join bb b on a.a=b.a and a.b=’wen’ ———(1)
select * from aa a left outer join bb b on a.a=b.a where a.b=’wen’——(2)
其中表bb跟表aa的结构一样,如下:
create table aa
(a int primary key,
b varchar(20))
结果如下:
语句(1):
a b a b
———– ——————– ———– ——————–
1 wen 1 today
2 su NULL NULL
3 test NULL NULL
4 ok NULL NULL
5 niu NULL NULL
(5 [...]
问题描述:
—————
MSCS一个节点的Cluster Service无法启动,这时在另一节点上的sql server的resource一直处于online pending状态,查看windows event发现event id 1145错误,该event id建议调整该resource的pend timeout时间,但调整后还是处于online pending…系统重起后状况依旧,但启动时提示:
At least one service or driver failed during system startup. Use Event
Viewer to examine the event log for details
解决过程:
————-
1.在网上查找关于event id 1145的解决方法,未果;
2.将其中一节点关掉,单节点进行测试,发现本节点上的service可以起来,原本属于另一节点的service无法起来;
3.查看 cluster.log,没发现异常状况;
4.最后该公司DBA(lm.lv)发现其中一节点上的event viewer上有如下错误:
Event ID 7022 Source: Service Control Manager
Description: The Messenger Service hung on startup
在微软网站上查找,提供如下解决方法:
CAUSE
This behavior can occur if a file that is associated with [...]
这是从CSDN上转移过来的帖子,问题发生的时间是:2004/9/22
——————————————————————————————–
Table error: Database ID 20, object ID 5575058, index ID 0. Chain linkage mismatch. (1:1617)->next = (1:1618), but (1:1618)->prev = (1:356)..
Error: 8908, Severity: 22, State: 6
查了一下online book,解释如下:
Message Text
Table error: Database ID %d, object ID %d, index ID %d. Chain linkage mismatch. %S_PGID->next = %S_PGID, but %S_PGID->prev = %S_PGID.
Explanation
This error occurs when Microsoft® SQL Server™ detects [...]
第二种方法:
先用VB写一个dll,比如叫intToHex,里面代码如下:
Option Explicit
Public Function IntToHex(intValue As Long, Optional intlength As Long = 2) As String
IntToHex = Hex$(intValue)
If Len(IntToHex) < intlength Then
Dim i As Integer
For i = 1 To intlength - Len(IntToHex)
IntToHex = “0″ & IntToHex
Next
End If
End Function
其中intValue是要转化的数字,intlength是转化后要保留的字符的长度
将其编译成dll,然后在sql server中执行如下命令注册:
regsvr32 c:\intTohex.dll
然后自己写一个自定义函数,去实现这个功能:
CREATE FUNCTION dbo.fn_GetHexStr ( @intValue int,@paraValue int=4)
RETURNS VARCHAR(10)
AS
BEGIN
DECLARE @object int
DECLARE @hr [...]
两种方法的优缺点:
第一种方法采用自定义函数实现,无须另外写dll,也无须考虑安全性的问题,大家知道sql server中使用sp_oacreate这个存储过程是很危险的,而且执行sp_oacreate需要sysadmin权限,而第一种方法就可以不必考虑这个问题,但第一种方法的缺点是不好控制字符输出格式,而第二种方法很容易控制字符输出的格式
两种方法性能上的比较
我们做如下测试:
新建一Table,如下:
CREATE TABLE Int_To_Hex
(
intValue int ,
strHex varchar(255))
DECLARE @I INT
SET @I=0
WHILE(@I<=10000)
BEGIN
INSERT INTO Int_To_Hex(intValue) VALUES(@I)
SET @I=@I+1
END
我的电脑配置:
IBMX30 RAM:512M CPU:P3 1066
第二种方法:
UPDATE Int_To_Hex SET strHex=dbo.fn_GetHexStr(intValue,3)
UPDATE 10001笔,总共耗时13秒,update结果如下:
intValue strHex
—————————
0 000
1 001
2 002
3 003
4 004
5 005
6 006
7 007
8 008
9 009
10 00A
11 00B
12 00C
13 00D
第一种方法:
UPDATE Int_To_Hex SET strHex=dbo.fn_hexadecimal(intValue)
同样是10001笔资料,共耗时1秒,结果如下:
intValue strHex
—————————
0 000
1 001
2 002
3 003
4 004
5 005
6 006
7 007
8 008
9 009
10 [...]