|
一、 只复制一个表结构,不复制数据
select
top
0
*
into
[
t1
]
from
[
t2
]
二、 获取数据库中某个对象的创建脚本 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
4、 声明,此函数是csdn邹建邹老大提供的 三、 分隔字符串 如果有一个用逗号分割开的字符串,比如说"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
)
四、 一条语句执行跨越若干个数据库 我要在一条语句里操作不同的服务器上的不同的数据库里的不同的表,怎么办呢? 第一种方法:
select
*
from
OPENDATASOURCE
(
'
SQLOLEDB
'
,
'
Data Source=远程ip;User ID=sa;Password=密码
'
).库名.dbo.表名
第二种方法: 先使用联结服务器:
EXEC
sp_addlinkedserver
'
别名
|