Sql server 如何在SQL Server中使用列的值查找列和表名?

Sql server 如何在SQL Server中使用列的值查找列和表名?,sql-server,tsql,Sql Server,Tsql,在T-SQL中,如果只知道一列的值,即“Ferrari”,那么是否可以使用任何查询或技巧来知道列名、表名、数据库名?根本不说这是最佳的,但这将找到值为“Ferrari”的列的表名、架构和列名 -- 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))

在T-SQL中,如果只知道一列的值,即“Ferrari”,那么是否可以使用任何查询或技巧来知道列名、表名、数据库名?

根本不说这是最佳的,但这将找到值为“Ferrari”的列的表名、架构和列名

-- 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 + '=@p1;';
        exec sp_executesql @q, N'@p0 bit out, @p1 varchar(50)', @p1=@v,@p0=@c 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

你能举个例子吗?您的意思是一个表包含一行,其中一列的值为Ferrari,您想知道哪个列名和表包含该值吗?您的意思是有一个值Ferrari,您需要找到它的存储位置吗?