知道字段名,如何根据该字段的值查找到表名

时间:2021-10-01 14:42:08
知道字段名,并且每张表都有该字段,在程序代码中如何根据 字段值得到该字段值所在的 表名
例如:每张表中都有Name这个字段,如何根据字段值'Zs',查找出该字段值所在的表
从网上找到的都是在SQLServer里执行的,那在 WinForm程序代码中该怎么写呢?

20 个解决方案

#1


sqlserver sql语句就能查找到,你在winform中再用ado.net执行这条sql语法返回就可以了。

#2


引用 1 楼 guwei4037 的回复:
sqlserver sql语句就能查找到,你在winform中再用ado.net执行这条sql语法返回就可以了。

那个好多,好复杂,看不太懂,不知道怎么改
DECLARE @what varchar(800)
SET @what='%Zs%'--要搜索的字符串
DECLARE @sqlStr varchar(8000)
DECLARE TableCursor CURSOR LOCAL FOR
SELECT sqlStr='IF EXISTS ( SELECT 1 FROM ['+o.name+'] 
WHERE ['+c.name+'] LIKE ''%'+@what+'%'' ) PRINT ''['+o.name+']'''
FROM syscolumns c JOIN sysobjects o ON c.id=o.id
WHERE o.xtype='U' AND c.status>=0 AND c.xusertype IN (175, 239, 231, 167 )
OPEN TableCursor
FETCH NEXT FROM TableCursor INTO @sqlStr
WHILE @@FETCH_STATUS=0
BEGIN
    EXEC( @sqlStr )
    FETCH NEXT FROM TableCursor INTO @sqlStr
END
CLOSE TableCursor
DEALLOCATE TableCursor

#3


楼主还是不要瞎想了,这种操作本身并不难,只是太奇葩,只要对数据库有一定了解都能办到.

#4


引用 3 楼 tcmakebest 的回复:
楼主还是不要瞎想了,这种操作本身并不难,只是太奇葩,只要对数据库有一定了解都能办到.

那该怎么解决呢,我程序要用到这些操作

#5


引用 4 楼 weiyf27 的回复:
Quote: 引用 3 楼 tcmakebest 的回复:

楼主还是不要瞎想了,这种操作本身并不难,只是太奇葩,只要对数据库有一定了解都能办到.

那该怎么解决呢,我程序要用到这些操作

2楼的SQL语句是可以直接在程序执行的
你将他当作SQL语句去使用就可以了。不要以为SQL真的只有增删改查才可以执行

#6


引用 5 楼 fei2yun 的回复:
2楼的SQL语句是可以直接在程序执行的
你将他当作SQL语句去使用就可以了。不要以为SQL真的只有增删改查才可以执行


我把2楼的代码全放在sqlStr里了,为什么dt里没数据呢?
DataTable dt = GetDsFromSql(sqlStr).Tables[0];

public static DataSet GetDsFromSql(string sqlStr)
        {
            string strConnection = "...数据库连接正常...";
            SqlConnection conn = new SqlConnection(strConnection);
            DataSet ds = new DataSet();
            try
            {
                conn.Open();
                SqlDataAdapter da = new SqlDataAdapter(sqlStr, conn);
                da.Fill(ds);
            }
            catch (Exception e)
            {
                ds.Tables.Add("TempTable");
            }
            conn.Close();
            return ds;
        }

#7



-- 建一个存储过程,然后你在代码里面调用这个存储过程就可以了
-- 返回多个表,每表仅有一行一列,里面的值就是你要的tablename
create proc proc_GetTableName
@column varchar(50),
@value varchar(50)
as
begin
    declare @table varchar(50)
    declare cur cursor for
    select name from sysobjects where type = 'U'
    open cur
    fetch next from cur into @table
    while(@@fetch_status = 0)
        begin
            if(col_length(@table,@column) is not null)
                begin
                    declare @sql nvarchar(4000)
                    declare @result int
                    set @sql = 'select @count = count(1) from '+@table+' where '+@column+' like ''%'+@value+'%'''
                    exec sp_executesql @sql,N'@count int output',@result output
                    if(@result > 0)
                        begin
                            select @table
                        end
                end
            fetct next from cur into @table
        end
    close cur
    deallocate cur
end

#8


引用 6 楼 weiyf27 的回复:
Quote: 引用 5 楼 fei2yun 的回复:

2楼的SQL语句是可以直接在程序执行的
你将他当作SQL语句去使用就可以了。不要以为SQL真的只有增删改查才可以执行


我把2楼的代码全放在sqlStr里了,为什么dt里没数据呢?
DataTable dt = GetDsFromSql(sqlStr).Tables[0];

public static DataSet GetDsFromSql(string sqlStr)
        {
            string strConnection = "...数据库连接正常...";
            SqlConnection conn = new SqlConnection(strConnection);
            DataSet ds = new DataSet();
            try
            {
                conn.Open();
                SqlDataAdapter da = new SqlDataAdapter(sqlStr, conn);
                da.Fill(ds);
            }
            catch (Exception e)
            {
                ds.Tables.Add("TempTable");
            }
            conn.Close();
            return ds;
        }

2楼的是print出来,所以你的代码接收不到.
思路是一样的,建立游标从系统表里面读出所有的tablename
select name from sysobjects where type = 'U'
然后遍历,判断表是否存在你指定的列
if(col_length(@table,@column) is not null)
最后,有指定列的表,就根据where column like '%'+value+'%'去读取是否有指定的指,
读取到之后select tablename出来.

#9


http://blog.csdn.net/yangyi22/article/details/7555662

#10


这是SQL注入的范畴,LZ可以找度娘查查

#11


引用 8 楼 BitCoffee 的回复:
2楼的是print出来,所以你的代码接收不到.
思路是一样的,建立游标从系统表里面读出所有的tablename
select name from sysobjects where type = 'U'
然后遍历,判断表是否存在你指定的列
if(col_length(@table,@column) is not null)
最后,有指定列的表,就根据where column like '%'+value+'%'去读取是否有指定的指,
读取到之后select tablename出来.

执行7楼代码 加  Exec proc_GetTableName 'Name','Zs'  吗?

#12


引用 11 楼 weiyf27 的回复:
Quote: 引用 8 楼 BitCoffee 的回复:

2楼的是print出来,所以你的代码接收不到.
思路是一样的,建立游标从系统表里面读出所有的tablename
select name from sysobjects where type = 'U'
然后遍历,判断表是否存在你指定的列
if(col_length(@table,@column) is not null)
最后,有指定列的表,就根据where column like '%'+value+'%'去读取是否有指定的指,
读取到之后select tablename出来.

执行7楼代码 加  Exec proc_GetTableName 'Name','Zs'  吗?

恩,直接proc_GetTableName 'Name','Zs'也可以.

#13


引用 12 楼 BitCoffee 的回复:
恩,直接proc_GetTableName 'Name','Zs'也可以.

把代码都放在sql语句里了,可是在测试中dt里还是没数据,在SQLServer查询里,执行结果是“命令已成功完成”

#14


别搞那么复杂,直接用下面的,有多少表写多少

select name, 'table1' from table1 where name = ‘Zs’
union all
select name, 'table2' from table2 where name = ‘Zs’
union all
select name, 'table3' from table3 where name = ‘Zs’

#15


1、获取所有数据库名
Select Name From Master..SysDatabases order By Name
2、获取所有表名 Select Name From SysObjects Where XType='U' order By Name
  XType='U':表示所有用户表; XType='S':表示所有系统表;
3、.获取所有字段名 Select Name From SysColumns Where id=Object_Id(‘TableName’)

对所有表名的集合中,含有指定字段名的表做查询
直到找到你需要的表,或失败

你连过程化的查询都不清楚,就去套用不一定正确的存储过程,成功率是极低的

#16


引用 14 楼 xdashewan 的回复:
别搞那么复杂,直接用下面的,有多少表写多少

select name, 'table1' from table1 where name = ‘Zs’
union all
select name, 'table2' from table2 where name = ‘Zs’
union all
select name, 'table3' from table3 where name = ‘Zs’

额,数据库的表是动态生成的,有n个

#17


引用 15 楼 xuzuning 的回复:
1、获取所有数据库名
Select Name From Master..SysDatabases order By Name
2、获取所有表名 Select Name From SysObjects Where XType='U' order By Name
  XType='U':表示所有用户表; XType='S':表示所有系统表;
3、.获取所有字段名 Select Name From SysColumns Where id=Object_Id(‘TableName’)

对所有表名的集合中,含有指定字段名的表做查询
直到找到你需要的表,或失败

你连过程化的查询都不清楚,就去套用不一定正确的存储过程,成功率是极低的


菜鸟一只,之前数据库只接触过最简单的增删改查。

#18


所以你需要先搞清原理,在动手

#19


引用 16 楼 weiyf27 的回复:
额,数据库的表是动态生成的,有n个

表都能动态生成,语句不能动态生成?再不济,你多生成一张表用于记录表名也能办到

#20


谢谢各位大神的热心解答,我再花时间多学习下,试试大神们的方法

#1


sqlserver sql语句就能查找到,你在winform中再用ado.net执行这条sql语法返回就可以了。

#2


引用 1 楼 guwei4037 的回复:
sqlserver sql语句就能查找到,你在winform中再用ado.net执行这条sql语法返回就可以了。

那个好多,好复杂,看不太懂,不知道怎么改
DECLARE @what varchar(800)
SET @what='%Zs%'--要搜索的字符串
DECLARE @sqlStr varchar(8000)
DECLARE TableCursor CURSOR LOCAL FOR
SELECT sqlStr='IF EXISTS ( SELECT 1 FROM ['+o.name+'] 
WHERE ['+c.name+'] LIKE ''%'+@what+'%'' ) PRINT ''['+o.name+']'''
FROM syscolumns c JOIN sysobjects o ON c.id=o.id
WHERE o.xtype='U' AND c.status>=0 AND c.xusertype IN (175, 239, 231, 167 )
OPEN TableCursor
FETCH NEXT FROM TableCursor INTO @sqlStr
WHILE @@FETCH_STATUS=0
BEGIN
    EXEC( @sqlStr )
    FETCH NEXT FROM TableCursor INTO @sqlStr
END
CLOSE TableCursor
DEALLOCATE TableCursor

#3


楼主还是不要瞎想了,这种操作本身并不难,只是太奇葩,只要对数据库有一定了解都能办到.

#4


引用 3 楼 tcmakebest 的回复:
楼主还是不要瞎想了,这种操作本身并不难,只是太奇葩,只要对数据库有一定了解都能办到.

那该怎么解决呢,我程序要用到这些操作

#5


引用 4 楼 weiyf27 的回复:
Quote: 引用 3 楼 tcmakebest 的回复:

楼主还是不要瞎想了,这种操作本身并不难,只是太奇葩,只要对数据库有一定了解都能办到.

那该怎么解决呢,我程序要用到这些操作

2楼的SQL语句是可以直接在程序执行的
你将他当作SQL语句去使用就可以了。不要以为SQL真的只有增删改查才可以执行

#6


引用 5 楼 fei2yun 的回复:
2楼的SQL语句是可以直接在程序执行的
你将他当作SQL语句去使用就可以了。不要以为SQL真的只有增删改查才可以执行


我把2楼的代码全放在sqlStr里了,为什么dt里没数据呢?
DataTable dt = GetDsFromSql(sqlStr).Tables[0];

public static DataSet GetDsFromSql(string sqlStr)
        {
            string strConnection = "...数据库连接正常...";
            SqlConnection conn = new SqlConnection(strConnection);
            DataSet ds = new DataSet();
            try
            {
                conn.Open();
                SqlDataAdapter da = new SqlDataAdapter(sqlStr, conn);
                da.Fill(ds);
            }
            catch (Exception e)
            {
                ds.Tables.Add("TempTable");
            }
            conn.Close();
            return ds;
        }

#7



-- 建一个存储过程,然后你在代码里面调用这个存储过程就可以了
-- 返回多个表,每表仅有一行一列,里面的值就是你要的tablename
create proc proc_GetTableName
@column varchar(50),
@value varchar(50)
as
begin
    declare @table varchar(50)
    declare cur cursor for
    select name from sysobjects where type = 'U'
    open cur
    fetch next from cur into @table
    while(@@fetch_status = 0)
        begin
            if(col_length(@table,@column) is not null)
                begin
                    declare @sql nvarchar(4000)
                    declare @result int
                    set @sql = 'select @count = count(1) from '+@table+' where '+@column+' like ''%'+@value+'%'''
                    exec sp_executesql @sql,N'@count int output',@result output
                    if(@result > 0)
                        begin
                            select @table
                        end
                end
            fetct next from cur into @table
        end
    close cur
    deallocate cur
end

#8


引用 6 楼 weiyf27 的回复:
Quote: 引用 5 楼 fei2yun 的回复:

2楼的SQL语句是可以直接在程序执行的
你将他当作SQL语句去使用就可以了。不要以为SQL真的只有增删改查才可以执行


我把2楼的代码全放在sqlStr里了,为什么dt里没数据呢?
DataTable dt = GetDsFromSql(sqlStr).Tables[0];

public static DataSet GetDsFromSql(string sqlStr)
        {
            string strConnection = "...数据库连接正常...";
            SqlConnection conn = new SqlConnection(strConnection);
            DataSet ds = new DataSet();
            try
            {
                conn.Open();
                SqlDataAdapter da = new SqlDataAdapter(sqlStr, conn);
                da.Fill(ds);
            }
            catch (Exception e)
            {
                ds.Tables.Add("TempTable");
            }
            conn.Close();
            return ds;
        }

2楼的是print出来,所以你的代码接收不到.
思路是一样的,建立游标从系统表里面读出所有的tablename
select name from sysobjects where type = 'U'
然后遍历,判断表是否存在你指定的列
if(col_length(@table,@column) is not null)
最后,有指定列的表,就根据where column like '%'+value+'%'去读取是否有指定的指,
读取到之后select tablename出来.

#9


http://blog.csdn.net/yangyi22/article/details/7555662

#10


这是SQL注入的范畴,LZ可以找度娘查查

#11


引用 8 楼 BitCoffee 的回复:
2楼的是print出来,所以你的代码接收不到.
思路是一样的,建立游标从系统表里面读出所有的tablename
select name from sysobjects where type = 'U'
然后遍历,判断表是否存在你指定的列
if(col_length(@table,@column) is not null)
最后,有指定列的表,就根据where column like '%'+value+'%'去读取是否有指定的指,
读取到之后select tablename出来.

执行7楼代码 加  Exec proc_GetTableName 'Name','Zs'  吗?

#12


引用 11 楼 weiyf27 的回复:
Quote: 引用 8 楼 BitCoffee 的回复:

2楼的是print出来,所以你的代码接收不到.
思路是一样的,建立游标从系统表里面读出所有的tablename
select name from sysobjects where type = 'U'
然后遍历,判断表是否存在你指定的列
if(col_length(@table,@column) is not null)
最后,有指定列的表,就根据where column like '%'+value+'%'去读取是否有指定的指,
读取到之后select tablename出来.

执行7楼代码 加  Exec proc_GetTableName 'Name','Zs'  吗?

恩,直接proc_GetTableName 'Name','Zs'也可以.

#13


引用 12 楼 BitCoffee 的回复:
恩,直接proc_GetTableName 'Name','Zs'也可以.

把代码都放在sql语句里了,可是在测试中dt里还是没数据,在SQLServer查询里,执行结果是“命令已成功完成”

#14


别搞那么复杂,直接用下面的,有多少表写多少

select name, 'table1' from table1 where name = ‘Zs’
union all
select name, 'table2' from table2 where name = ‘Zs’
union all
select name, 'table3' from table3 where name = ‘Zs’

#15


1、获取所有数据库名
Select Name From Master..SysDatabases order By Name
2、获取所有表名 Select Name From SysObjects Where XType='U' order By Name
  XType='U':表示所有用户表; XType='S':表示所有系统表;
3、.获取所有字段名 Select Name From SysColumns Where id=Object_Id(‘TableName’)

对所有表名的集合中,含有指定字段名的表做查询
直到找到你需要的表,或失败

你连过程化的查询都不清楚,就去套用不一定正确的存储过程,成功率是极低的

#16


引用 14 楼 xdashewan 的回复:
别搞那么复杂,直接用下面的,有多少表写多少

select name, 'table1' from table1 where name = ‘Zs’
union all
select name, 'table2' from table2 where name = ‘Zs’
union all
select name, 'table3' from table3 where name = ‘Zs’

额,数据库的表是动态生成的,有n个

#17


引用 15 楼 xuzuning 的回复:
1、获取所有数据库名
Select Name From Master..SysDatabases order By Name
2、获取所有表名 Select Name From SysObjects Where XType='U' order By Name
  XType='U':表示所有用户表; XType='S':表示所有系统表;
3、.获取所有字段名 Select Name From SysColumns Where id=Object_Id(‘TableName’)

对所有表名的集合中,含有指定字段名的表做查询
直到找到你需要的表,或失败

你连过程化的查询都不清楚,就去套用不一定正确的存储过程,成功率是极低的


菜鸟一只,之前数据库只接触过最简单的增删改查。

#18


所以你需要先搞清原理,在动手

#19


引用 16 楼 weiyf27 的回复:
额,数据库的表是动态生成的,有n个

表都能动态生成,语句不能动态生成?再不济,你多生成一张表用于记录表名也能办到

#20


谢谢各位大神的热心解答,我再花时间多学习下,试试大神们的方法

#21