一些t-sql技巧

    本文的源地址:  
    [1] http://ghd258.cnblogs.com/archive/2006/03/20/354147.html

    [2] http://ghd258.cnblogs.com/archive/2006/07/14/450585.html

    [3 http://ghd258.cnblogs.com/archive/2006/02/12/329288.html

    1 只复制一个表结构,不复制数据

    select top 0 * into [t1] from [t2]

    2 获取数据库中某个对象的创建脚本

    (1) 先用下面的脚本创建一个函数

if   exists ( select   1   from  sysobjects  where  id = object_id ( ' fgetscript ' and   objectproperty (id, ' IsInlineFunction ' ) = 0 )
  
drop   function  fgetscript
go

create   function  fgetscript(
@servername   varchar ( 50 )      -- 服务器名
 , @userid   varchar ( 50 ) = ' sa '      -- 用户名,如果为nt验证方式,则为空
 , @password   varchar ( 50 ) = ''      -- 密码
 , @databasename   varchar ( 50 )     -- 数据库名称
 , @objectname   varchar ( 250 )     -- 对象名
returns   varchar ( 8000 )
as
begin
 
declare   @re   varchar ( 8000 )         -- 返回脚本
  declare   @srvid   int , @dbsid   int         -- 定义服务器、数据库集id
  declare   @dbid   int , @tbid   int          -- 数据库、表id
  declare   @err   int , @src   varchar ( 255 ),  @desc   varchar ( 255 -- 错误处理变量

-- 创建sqldmo对象
  exec   @err = sp_oacreate  ' sqldmo.sqlserver ' , @srvid  output
 
if   @err <> 0   goto  lberr

-- 连接服务器
  if   isnull ( @userid , '' ) = ''   -- 如果是 Nt验证方式
  begin
  
exec   @err = sp_oasetproperty  @srvid , ' loginsecure ' , 1
  
if   @err <> 0   goto  lberr

  
exec   @err = sp_oamethod  @srvid , ' connect ' , null , @servername
 
end
 
else
  
exec   @err = sp_oamethod  @srvid , ' connect ' , null , @servername , @userid , @password

 
if   @err <> 0   goto  lberr

-- 获取数据库集
  exec   @err = sp_oagetproperty  @srvid , ' databases ' , @dbsid  output
 
if   @err <> 0   goto  lberr

-- 获取要取得脚本的数据库id
  exec   @err = sp_oamethod  @dbsid , ' item ' , @dbid  output, @databasename
 
if   @err <> 0   goto  lberr

-- 获取要取得脚本的对象id
  exec   @err = sp_oamethod  @dbid , ' getobjectbyname ' , @tbid  output, @objectname
 
if   @err <> 0   goto  lberr

-- 取得脚本
  exec   @err = sp_oamethod  @tbid , ' script ' , @re  output
 
if   @err <> 0   goto  lberr

 
-- print @re
  return ( @re )

lberr:
 
exec  sp_oageterrorinfo  NULL @src  out,  @desc  out 
 
declare   @errb   varbinary ( 4 )
 
set   @errb = cast ( @err   as   varbinary ( 4 ))
 
exec  master..xp_varbintohexstr  @errb , @re  out
 
set   @re = ' 错误号:  ' + @re
   
+ char ( 13 ) + ' 错误源:  ' + @src
   
+ char ( 13 ) + ' 错误描述:  ' + @desc
 
return ( @re )
end
go


    (2)用法如下:

print  dbo.fgetscript( ' 服务器名 ' , ' 用户名 ' , ' 密码 ' , ' 数据库名 ' , ' 表名或其它对象名 ' )


    (3)如果要获取库里所有对象的脚本,如如下方式

declare   @name   varchar ( 250 )
declare  #aa  cursor   for
select  name  from  sysobjects  where  xtype  not   in ( ' S ' , ' PK ' , ' D ' , ' X ' , ' L ' )
open  #aa
fetch   next   from  #aa  into   @name
while   @@fetch_status = 0
begin
 
print  dbo.fgetscript( ' onlytiancai ' , ' sa ' , ' sa ' , ' database ' , @name )
 
fetch   next   from  #aa  into   @name
end
close  #aa
deallocate  #aa


    3 分隔字符串

    如果有一个用逗号分割开的字符串,比如说"a,b,c,d,1,2,3,4",如何用t-sql获取这个字符串有几个元素,获取第几个元素的值是多少呢?因为t-sql里没有split函数,也没有数组的概念,所以只能自己写几个函数了。

    (1) 获取元素个数的函数

 

create   function  getstrarrlength ( @str   varchar ( 8000 ))
returns   int
as
begin
  
declare   @int_return   int
  
declare   @start   int
  
declare   @next   int
  
declare   @location   int
  
select   @str   = ' , ' +   @str   + ' , '
  
select   @str = replace ( @str , ' ,, ' , ' , ' )
  
select   @start   = 1
  
select   @next   = 1  
  
select   @location   =   charindex ( ' , ' , @str , @start )
  
while  ( @location   <> 0 )
  
begin
    
select   @start   =   @location   + 1
    
select   @location   =   charindex ( ' , ' , @str , @start )
    
select   @next   = @next   + 1
  
end
 
select   @int_return   =   @next - 2
 
return   @int_return
end


    (2) 获取指定索引的值的函数

 

create   function  getstrofindex ( @str   varchar ( 8000 ), @index   int   = 0 )
returns   varchar ( 8000 )
as
begin
  
declare   @str_return   varchar ( 8000 )
  
declare   @start   int
  
declare   @next   int
  
declare   @location   int
  
select   @start   = 1
  
select   @next   = 1   -- 如果习惯从0开始则select @next =0
   select   @location   =   charindex ( ' , ' , @str , @start )
  
while  ( @location   <> 0   and   @index   >   @next  )
  
begin
    
select   @start   =   @location   + 1
    
select   @location   =   charindex ( ' , ' , @str , @start )
    
select   @next   = @next   + 1
  
end
  
if   @location   = 0   select   @location   = len ( @str ) + 1   -- 如果是因为没有逗号退出,则认为逗号在字符串后
   select   @str_return   =   substring ( @str , @start , @location   - @start -- @start肯定是逗号之后的位置或者就是初始值1
   if  ( @index   <>   @next  )  select   @str_return   =   ''   -- 如果二者不相等,则是因为逗号太少,或者@index小于@next的初始值1。
   return   @str_return
end


    (3) 用法如下:

SELECT   [ dbo ] . [ getstrarrlength ] ( ' 1,2,3,4,a,b,c,d ' )
SELECT   [ dbo ] . [ getstrofindex ] ( ' 1,2,3,4,a,b,c,d ' , 5 )

    4  一条语句执行跨越若干个数据库

    我要在一条语句里操作不同的服务器上的不同的数据库里的不同的表,怎么办呢?
    方法一:

select   *   from   OPENDATASOURCE ( ' SQLOLEDB ' , ' Data Source=远程ip;User ID=sa;Password=密码 ' ).库名.dbo.表名

    方法二:
    先使用联结服务器:

EXEC  sp_addlinkedserver  ' 别名 ' , '' , ' MSDASQL ' , NULL , NULL , ' DRIVER={SQL Server};SERVER=远程名;UID=用户;PWD=密码; '
exec  sp_addlinkedsrvlogin   @rmtsrvname = ' 别名 ' , @useself = ' false ' , @locallogin = ' sa ' , @rmtuser = ' sa ' , @rmtpassword = ' 密码 '
GO

    然后:

select   *   from  别名.库名.dbo.表名
insert  库名.dbo.表名  select   *   from  别名.库名.dbo.表名
select   *   into  库名.dbo.新表名  from  别名.库名.dbo.表名
go


    5 获取一个表中所有的字段信息

    先创建一个视图

Create   view  fielddesc    
as
select  o.name  as  table_name,c.name  as  field_name,t.name  as  type,c.length  as  

length,c.isnullable 
as  isnullable, convert ( varchar ( 30 ),p.value)  as  desp 
from  syscolumns c  
join  systypes t  on  c.xtype  =  t.xusertype
join  sysobjects o  on  o.id = c.id 
left   join     sysproperties p  on  p.smallid = c.colid  and  p.id = o.id    
where  o.xtype = ' U '

 

    查询时:

Select   *   from  fielddesc  where  table_name  =   ' 你的表名 '  

 

    还有个更强的语句,是邹建写的,也写出来吧

SELECT  
 (
case   when  a.colorder = 1   then  d.name  else   ''   end ) N ' 表名 ' ,
 a.colorder N
' 字段序号 ' ,
 a.name N
' 字段名 ' ,
 (
case   when   COLUMNPROPERTY ( a.id,a.name, ' IsIdentity ' ) = 1   then   ' ' else   ''   end ) N ' 标识 ' ,
 (
case   when  ( SELECT   count ( * )
 
FROM  sysobjects
 
WHERE  (name  in
           (
SELECT  name
          
FROM  sysindexes
          
WHERE  (id  =  a.id)  AND  (indid  in
                    (
SELECT  indid
                   
FROM  sysindexkeys
                   
WHERE  (id  =  a.id)  AND  (colid  in
                             (
SELECT  colid
                            
FROM  syscolumns
                            
WHERE  (id  =  a.id)  AND  (name  =  a.name)))))))  AND
        (xtype 
=   ' PK ' )) > 0   then   ' '   else   ''   end ) N ' 主键 ' ,
 b.name N
' 类型 ' ,
 a.length N
' 占用字节数 ' ,
 
COLUMNPROPERTY (a.id,a.name, ' PRECISION ' as  N ' 长度 ' ,
 
isnull ( COLUMNPROPERTY (a.id,a.name, ' Scale ' ), 0 as  N ' 小数位数 ' ,
 (
case   when  a.isnullable = 1   then   ' ' else   ''   end ) N ' 允许空 ' ,
 
isnull (e. text , '' ) N ' 默认值 ' ,
 
isnull (g. [ value ] , '' AS  N ' 字段说明 '
-- into ##tx

FROM   syscolumns  a  left   join  systypes b 
on   a.xtype = b.xusertype
inner   join  sysobjects d 
on  a.id = d.id   and   d.xtype = ' U '   and   d.name <> ' dtproperties '
left   join  syscomments e
on  a.cdefault = e.id
left   join  sysproperties g
on  a.id = g.id  AND  a.colid  =  g.smallid  
order   by   object_name (a.id),a.colorder


    6  时间格式转换问题

    因为新开发的软件需要用一些旧软件生成的一些数据,在时间格式上不统一,只能手工转换,研究了一下午写了三条语句,以前没怎么用过convert函数和case语句,还有"+"操作符在不同上下文环境也会起到不同的作用,把我搞晕了要,不过现在看来是差不多弄好了。

    (1) 把所有"70.07.06"这样的值变成"1970-07-06"

UPDATE  lvshi
SET  shengri  =   ' 19 '   +   REPLACE (shengri,  ' . ' ' - ' )
WHERE  (zhiyezheng  =   ' 139770070153 ' )

 

    (2)在"1970-07-06"里提取"70","07","06"

SELECT   SUBSTRING (shengri,  3 2 AS   year SUBSTRING (shengri,  6 2 AS   month
      
SUBSTRING (shengri,  9 2 AS   day
FROM  lvshi
WHERE  (zhiyezheng  =   ' 139770070153 ' )

 

    (3)把一个时间类型字段转换成"1970-07-06"
 

UPDATE  lvshi
SET  shenling  =   CONVERT ( varchar ( 4 ),  YEAR (shenling)) 
      
+   ' - '   +   CASE   WHEN   LEN ( MONTH (shenling))  =   1   THEN   ' 0 '   +   CONVERT ( varchar ( 2 ), 
      
month (shenling))  ELSE   CONVERT ( varchar ( 2 ),  month (shenling)) 
      
END   +   ' - '   +   CASE   WHEN   LEN ( day (shenling))  =   1   THEN   ' 0 '   +   CONVERT ( char ( 2 ), 
      
day (shenling))  ELSE   CONVERT ( varchar ( 2 ),  day (shenling))  END
WHERE  (zhiyezheng  =   ' 139770070153 ' )

 

    7 分区视图

    分区视图是提高查询性能的一个很好的办法

 

-- 看下面的示例

-- 示例表
create   table  tempdb.dbo.t_10(
id 
int   primary   key   check (id  between   1   and   10 ),name  varchar ( 10 ))

create   table  pubs.dbo.t_20(
id 
int   primary   key   check (id  between   11   and   20 ),name  varchar ( 10 ))

create   table  northwind.dbo.t_30(
id 
int   primary   key   check (id  between   21   and   30 ),name  varchar ( 10 ))
go

-- 分区视图
create   view  v_t
as
select   *   from  tempdb.dbo.t_10
union   all
select   *   from  pubs.dbo.t_20
union   all
select   *   from  northwind.dbo.t_30
go

-- 插入数据
insert  v_t  select   1  , ' aa '
union    all   select   2  , ' bb '
union    all   select   11 , ' cc '
union    all   select   12 , ' dd '
union    all   select   21 , ' ee '
union    all   select   22 , ' ff '

-- 更新数据
update  v_t  set  name = name + ' _更新 '   where   right (id, 1 ) = 1

-- 删除测试
delete   from  v_t  where   right (id, 1 ) = 2

-- 显示结果
select   *   from  v_t
go

-- 删除测试
drop   table  northwind.dbo.t_30,pubs.dbo.t_20,tempdb.dbo.t_10
drop   view  v_t

/**/ /*--测试结果

id          name       
----------- ---------- 
1           aa_更新
11          cc_更新
21          ee_更新

(所影响的行数为 3 行)
==
*/

 


    8 树型的实现

 


-- 参考

-- 树形数据查询示例
--
作者: 邹建

-- 示例数据
create   table   [ tb ] ( [ id ]   int   identity ( 1 , 1 ), [ pid ]   int ,name  varchar ( 20 ))
insert   [ tb ]   select   0 , ' 中国 '
union    all    select   0 , ' 美国 '
union    all    select   0 , ' 加拿大 '
union    all    select   1 , ' 北京 '
union    all    select   1 , ' 上海 '
union    all    select   1 , ' 江苏 '
union    all    select   6 , ' 苏州 '
union    all    select   7 , ' 常熟 '
union    all    select   6 , ' 南京 '
union    all    select   6 , ' 无锡 '
union    all    select   2 , ' 纽约 '
union    all    select   2 , ' 旧金山 '
go

-- 查询指定id的所有子
create   function  f_cid(
@id   int
)
returns   @re   table ( [ id ]   int , [ level ]   int )
as
begin
 
declare   @l   int
 
set   @l = 0
 
insert   @re   select   @id , @l
 
while   @@rowcount > 0
 
begin
  
set   @l = @l + 1
  
insert   @re   select  a. [ id ] , @l
  
from   [ tb ]  a, @re  b
  
where  a. [ pid ] = b. [ id ]   and  b. [ level ] = @l - 1
 
end
/**/ /**/ /**/ /*--如果只显示最明细的子(下面没有子),则加上这个删除
 delete a from @re a
 where exists(
  select 1 from [tb] where [pid]=a.[id])
--
*/

 
return
end
go

-- 调用(查询所有的子)
select  a. * ,层次 = b. [ level ]   from   [ tb ]  a,f_cid( 2 )b  where  a. [ id ] = b. [ id ]
go

-- 删除测试
drop   table   [ tb ]
drop   function  f_cid
go

 

    9 排序问题

 数据库里有1,2,3,4,5 共5条记录,要用一条sql语句让其排序,使它排列成4,5,1,2,3,怎么写?

CREATE   TABLE   [ t ]  (
 
[ id ]   [ int ]   IDENTITY  ( 1 1 NOT   NULL  ,
 
[ GUID ]   [ uniqueidentifier ]   NULL  
ON   [ PRIMARY ]
GO

    下面这句执行5次

insert  t  values  ( newid ())

 

    查看执行结果

select   *   from  t

    (1) 第一种

select   *   from  t
 
order   by   case  id  when   4   then   1
                  
when   5   then   2
                  
when   1   then   3
                  
when   2   then   4
                  
when   3   then   5   end

    (2) 第二种

select   *   from  t  order   by  (id + 2 ) % 6

    (3) 第三种

select   *   from  t  order   by   charindex ( cast (id  as   varchar ), ' 45123 ' )

    (4) 第四种

select   *   from  t
WHERE  id  between   0   and   5
order   by   charindex ( cast (id  as   varchar ), ' 45123 ' )

    (5) 第五种

select   *   from  t  order   by   case   when  id  > 3   then  id - 5   else  id  end

    (6) 第六种

select   *   from  t  order   by  id  /   4   desc ,id  asc

    10 一条语句删除一批记录

    首先id列是int标识类类型,然后删除ID值为5,6,8,9,10,11的列,这里的cast函数不能用convert函数代替,而且转换的类型必须是varchar,而不能是char,否则就会执行出你不希望的结果,这里的"5,6,8,9,10,11"可以是你在页面上获取的一个chkboxlist构建成的值,然后用下面的一句就全部删除了,比循环用多条语句高效吧应该。

delete   from   [ fujian ]   where   charindex ( ' , ' + cast ( [ id ]   as   varchar ) + ' , ' , ' , ' + ' 5,6,8,9,10,11, ' + ' , ' ) > 0

    还有一种就是

delete   from  table1  where  id  in ( 1 , 2 , 3 , 4  )

    11 获取子表内的一列数据的组合字符串

    下面这个函数获取05年已经注册了的某个所的律师,唯一一个参数就是事务所的名称,然后返回zhuce字段里包含05字样的所有律师。 

CREATE     FUNCTION  fn_Get05LvshiNameBySuo  ( @p_suo   Nvarchar ( 50 ))
RETURNS   Nvarchar ( 2000 )
AS
BEGIN   
 
DECLARE   @LvshiNames   varchar ( 2000 ),  @name   varchar ( 50 )
 
select   @LvshiNames = ''
 
DECLARE  lvshi_cursor  CURSOR   FOR

    12 让0变成1,1变成0 

declare   @a   int
set   @a   = 0   -- 初始为0
select   @a
set   @a   =   @a ^ 1   -- 把0变成1
select   @a
set   @a   =   @a ^ 1   -- 把1变成0
select   @a

     13  四种方法取表里n到m条纪录

    (1) 第一种 

 如果tablename里没有其他identity列,那么:

 

select top m * into 临时表(或表变量) from tablename order by columnname -- 将top m笔插入
set rowcount  n
select * from 表变量 order by columnname desc

   (2) 第二种  

 

select   top  n  *   from  ( select   top  m  *   from  tablename  order   by  columnname) a  order   by  columnname  desc

   (3) 第三种

 select identity(int) id0,* into #temp from tablename

 取n到m条的语句为:

 select * from #temp where id0 >=n and id0 <= m

 如果你在执行 select identity(int) id0,* into #temp from tablename这条语句的时候报错,那是因为你的DB中间的select into/bulkcopy属性没有打开要先执行:
 exec sp_dboption 你的DB名字,'select into/bulkcopy',true


  
(4) 第四种
 如果表里有identity属性,那么简单: 

select * from tablename where identitycol between n and m 


  14 快速获取表test的记录总数

select  rows  from  sysindexes  where  id  =   object_id ( ' test ' and  indid  in  ( 0 , 1 )

  15 提取数据库内所有表的字段详细说明的SQL语句

SELECT  
(
case   when  a.colorder = 1   then  d.name  else   ''   end ) N ' 表名 '
a.colorder N
' 字段序号 '
a.name N
' 字段名 '
(
case   when   COLUMNPROPERTY ( a.id,a.name, ' IsIdentity ' ) = 1   then   ' ' else   ''  
end ) N ' 标识 '
(
case   when  ( SELECT   count ( *
FROM  sysobjects 
WHERE  (name  in  
(
SELECT  name 
FROM  sysindexes 
WHERE  (id  =  a.id)  AND  (indid  in  
(
SELECT  indid 
FROM  sysindexkeys 
WHERE  (id  =  a.id)  AND  (colid  in  
(
SELECT  colid 
FROM  syscolumns 
WHERE  (id  =  a.id)  AND  (name  =  a.name)))))))  AND  
(xtype 
=   ' PK ' )) > 0   then   ' '   else   ''   end ) N ' 主键 '
b.name N
' 类型 '
a.length N
' 占用字节数 '
COLUMNPROPERTY (a.id,a.name, ' PRECISION ' as  N ' 长度 '
isnull ( COLUMNPROPERTY (a.id,a.name, ' Scale ' ), 0 as  N ' 小数位数 '
(
case   when  a.isnullable = 1   then   ' ' else   ''   end ) N ' 允许空 '
isnull (e. text , '' ) N ' 默认值 '
isnull (g. [ value ] , '' AS  N ' 字段说明 '  
FROM  syscolumns a 
left   join  systypes b 
on  a.xtype = b.xusertype 
inner   join  sysobjects d 
on  a.id = d.id  and  d.xtype = ' U '   and  d.name <> ' dtproperties '  
left   join  syscomments e 
on  a.cdefault = e.id 
left   join  sysproperties g 
on  a.id = g.id  AND  a.colid  =  g.smallid 
order   by   object_name (a.id),a.colorder
获取表结构
[ 把 'sysobjects' 替换 成 'tablename' 即可 ]  

SELECT   CASE   IsNull (I.name,  ''
When   ''   Then   ''  
Else   ' * '  
End   as  IsPK, 
Object_Name (A.id)  as  t_name, 
A.name 
as  c_name, 
IsNull ( SubString (M. text 1 254 ),  '' as  pbc_init, 
T.name 
as  F_DataType, 
CASE   IsNull ( TYPEPROPERTY (T.name,  ' Scale ' ),  ''
WHEN   ''   Then   Cast (A.prec  as   varchar
ELSE   Cast (A.prec  as   varchar +   ' , '   +   Cast (A.scale  as   varchar
END   as  F_Scale, 
A.isnullable 
as  F_isNullAble 
FROM  Syscolumns  as  A 
JOIN  Systypes  as  T 
ON  (A.xType  =  T.xUserType  AND  A.Id  =   Object_id ( ' sysobjects ' ) ) 
LEFT   JOIN  ( SysIndexes  as  I 
JOIN  Syscolumns  as  A1 
ON  ( I.id  =  A1.id  and  A1.id  =   object_id ( ' sysobjects ' and  (I.status  &   0x800 =   0x800   AND  A1.colid  <=  I.keycnt) ) 
ON  ( A.id  =  I.id  AND  A.name  =   index_col ( ' sysobjects ' , I.indid, A1.colid) ) 
LEFT   JOIN  SysComments  as  M 
ON  ( M.id  =  A.cdefault  and   ObjectProperty (A.cdefault,  ' IsConstraint ' =   1  ) 
ORDER   BY  A.Colid  ASC


  16 SQL Server中删除重复数据的几个方法
 
   
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置。

  (1) 方法一

declare   @max   integer , @id   integer
declare  cur_rows  cursor  local  for   select  主字段, count ( * from  表名  group   by  主字段  having   count ( * >   1
open  cur_rows
fetch  cur_rows  into   @id , @max
while   @@fetch_status = 0
begin
select   @max   =   @max   - 1
set   rowcount   @max
delete   from  表名  where  主字段  =   @id
fetch  cur_rows  into   @id , @max
end
close  cur_rows
set   rowcount   0  

  (2) 方法二

  有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。

  〈1〉 对于第一种重复,比较容易解决,使用

select   distinct   *   from  tableName 

  就可以得到无重复记录的结果集。

  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除

select   distinct   *   into  #Tmp  from  tableName
drop   table  tableName
select   *   into  tableName  from  #Tmp
drop   table  #Tmp 

  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。

 〈2〉 这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下

 假设有重复的字段为Name, Address,要求得到这两个字段唯一的结果集

select   identity ( int , 1 , 1 as  autoID,  *   into  #Tmp  from  tableName
select   min (autoID)  as  autoID  into  #Tmp2  from  #Tmp  group   by  Name,autoID
select   *   from  #Tmp  where  autoID  in ( select  autoID  from  #tmp2) 

 最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)

  17 查询分析器不能单步调试的的原因

  具体步骤如下:
  1、将服务器【身份验证】属性设置成【混合模式】(window与sql身份验证)
  2、在【控制面板】中打开【服务】将【MSSQLSERVER】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123;
  3、重新启动sqlserver服务,此时的服务指的是【SQL服务管理器】中的SQL SERVER服务;假设【帐号】设置为administrator
  此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;
  如果想让【其他帐号】也能够调试,那么还需要如下设置:
  1、在【服务器】上运行dcomcnfg.exe;
  2、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组;
  3、重新启动sqlserver服务;
  3、在客户端上创建与服务帐号密码一样的用户,如sample;
  做到这步就可以通过查询分析器的调试功能进行单步调试了。
  注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。
  不然,event log:
  以当前密码登录的尝试因下列错误而宣告失败:
  在第一次登录之前,必须更改用户密码。

你可能感兴趣的:(JOIN,数据库,服务器,table,sqlserver,insert)