日期:2014-05-18  浏览次数:20493 次

截取字符串 表名
dbo.tab1 
dbo.[tab1] 
[dbo].[tab1]
这样写表名都是可以的

假设上面三个都是字符串, 怎么才能截取到真正的表名tab1?
相当于是要写一个函数
SQL code

create function dbo.GetTableName
(
    @tableName  nvarchar(250)
)returns nvarchar(150)
as
--.........



我遇到的难点是 sql server 貌似没有 RevCHARINDEX 函数; 而 PATINDEX 则存在 搜索通配符字符 的难题
SQL code

select PATINDEX ( '%[%]', '[schema1].[mytab2]' )

 


------解决方案--------------------
SQL code
DECLARE @str VARCHAR(20)
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

------解决方案--------------------
SQL code
if not object_id('tb') is null
    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 code

-- sql 2005
select PARSENAME('dbo.tab1',1);

-- sql 2000
declare @tabname sysname;
set @tabname='dbo.tab1';
select right(@tabname,charindex('.',reverse(@tabname))-1);