dbo.tab1
dbo.[tab1]
[dbo].[tab1]
这样写表名都是可以的假设上面三个都是字符串, 怎么才能截取到真正的表名tab1?
相当于是要写一个函数create function dbo.GetTableName
(
@tableName nvarchar(250)
)returns nvarchar(150)
as
--.........
我遇到的难点是 sql server 貌似没有 RevCHARINDEX 函数; 而 PATINDEX 则存在 搜索通配符字符 的难题select PATINDEX ( '%[%]', '[schema1].[mytab2]' )
dbo.[tab1]
[dbo].[tab1]
这样写表名都是可以的假设上面三个都是字符串, 怎么才能截取到真正的表名tab1?
相当于是要写一个函数create function dbo.GetTableName
(
@tableName nvarchar(250)
)returns nvarchar(150)
as
--.........
我遇到的难点是 sql server 貌似没有 RevCHARINDEX 函数; 而 PATINDEX 则存在 搜索通配符字符 的难题select PATINDEX ( '%[%]', '[schema1].[mytab2]' )
[tb]
tb
得到的都是tb
go
select name
from sys.tables
where name='tb'
go
drop table [tb]
/*
name
--------------------------------------------------------------------------------------------------------------------------------
tb(1 個資料列受到影響)
*/
'[myschema].[tab1]'
'dbo.tab1'你要能返回表名部分
from sys.tables
where name='dbo.tb'这样你就得不到表信息了吧
SET @str = '[dbo].[tab1]'IF (CHARINDEX('.',@str) > 0) SET @str = STUFF(@str,1,CHARINDEX('.',@str),'')
IF (CHARINDEX('[',@str) > 0) SET @str = STUFF(@str,1,CHARINDEX('[',@str),'')
IF (CHARINDEX(']',@str) > 0) SET @str = LEFT(@str,CHARINDEX(']',@str)-1)SELECT @str
drop table tb
Go
Create table tb([col] nvarchar(18))
Insert tb
select N'[schema1].[mytab2]' union all
select N'[myschema].[tab1]' union all
select N'dbo.tab1'
Go
Select replace(replace(right([col],len([col])-charindex('.',[col])),']',''),'[','')
from tb
/*
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
mytab2
tab1
tab1(3 個資料列受到影響)
*/
-- sql 2005
select PARSENAME('dbo.tab1',1);-- sql 2000
declare @tabname sysname;
set @tabname='dbo.tab1';
select right(@tabname,charindex('.',reverse(@tabname))-1);
drop table tb
Go
Create table tb([col] nvarchar(18))
Insert tb
select N'[schema1].[mytab2]' union all
select N'[myschema].[tab1]' union all
select N'dbo.tab1'
Go
select parsename([col],1) from tb
/*
--------------------------------------------------------------------------------------------------------------------------------
mytab2
tab1
tab1(3 個資料列受到影響)
*/