2012-12-07 46 views
0

在T-SQL中,如果只知道一列的值爲''法拉利',那麼是否有可能使用任何查詢或技巧知道列名錶名,數據庫名?如何使用SQL Server中的列值查找列和表名稱?

+0

你可以發佈一個例子列的表名,架構和列名?你的意思是說一個表包含一行,其中一列的值爲'法拉利',並且你想知道哪個列名和表包含這個值? – Oded

+0

你的意思是你有一個價值「法拉利」,你需要找到它的存儲位置? – gotqn

回答

1

不是說這是最佳的一切,但這會發現與價值「法拉利」

-- I will use a PROC so we create a table-type 
create type Meta as table (rid int identity primary key, ts varchar(100), tn varchar(100), cn varchar(100)) 

--Now create the proc 
    create proc [dbo].[foo] 
( 
    @t Meta readonly, 
    @v varchar(50) 
) 
AS 
begin 
    declare @max int 
    declare @c bit 
    declare @i int 
    declare @ts varchar(100) 
    declare @tn varchar(100) 
    declare @cn varchar(100) 
    declare @q nvarchar(max) 

    set @max = (select max(rid) from @t); 
    set @c = 0; 
    set @i = 0; 
    while(@i <= @max) 
    begin 
     set @i += 1; 
     select @ts = ts, @tn = tn, @cn = cn from @t where rid = @i; 
     set @q = N'select @p0 = 1 from ' + @ts + '.' + @tn + ' where ' + @cn + '[email protected];'; 
     exec sp_executesql @q, N'@p0 bit out, @p1 varchar(50)', @[email protected],@[email protected] out 
     if(@c > 0) 
     begin 
      set @c = 1; 
      break; 
     end 
    end 

    if(@c = 1) 
     select @ts + '.' + @tn + '.' + @cn; 
    else 
     select null; 
end 

-- Now use it 
declare @v varchar(50) 
set @v = 'Ferrari' 

declare @t Meta 
insert into @t 
select 
    c.TABLE_SCHEMA, c.TABLE_NAME, c.COLUMN_NAME 
from INFORMATION_SCHEMA.COLUMNS c 
where 
    c.DATA_TYPE like '%varchar' 
    and c.CHARACTER_MAXIMUM_LENGTH >= len(@v) 

exec dbo.foo @t = @t, @v = @v 
相關問題