问题描述
知道字段名,并且每张表都有该字段,在程序代码中如何根据字段值得到该字段值所在的表名。例如:每张表中都有Name这个字段,如何根据字段值'Zs',查找出该字段值所在的表从网上找到的都是在SQLServer里执行的,那在WinForm程序代码中该怎么写呢?
解决方案
解决方案二:
sqlserversql语句就能查找到,你在winform中再用ado.net执行这条sql语法返回就可以了。
解决方案三:
引用1楼guwei4037的回复:
sqlserversql语句就能查找到,你在winform中再用ado.net执行这条sql语法返回就可以了。
那个好多,好复杂,看不太懂,不知道怎么改DECLARE@whatvarchar(800)SET@what='%Zs%'--要搜索的字符串DECLARE@sqlStrvarchar(8000)DECLARETableCursorCURSORLOCALFORSELECTsqlStr='IFEXISTS(SELECT1FROM['+o.name+']WHERE['+c.name+']LIKE''%'+@what+'%'')PRINT''['+o.name+']'''FROMsyscolumnscJOINsysobjectsoONc.id=o.idWHEREo.xtype='U'ANDc.status>=0ANDc.xusertypeIN(175,239,231,167)OPENTableCursorFETCHNEXTFROMTableCursorINTO@sqlStrWHILE@@FETCH_STATUS=0BEGINEXEC(@sqlStr)FETCHNEXTFROMTableCursorINTO@sqlStrENDCLOSETableCursorDEALLOCATETableCursor
解决方案四:
楼主还是不要瞎想了,这种操作本身并不难,只是太奇葩,只要对数据库有一定了解都能办到.
解决方案五:
引用3楼tcmakebest的回复:
楼主还是不要瞎想了,这种操作本身并不难,只是太奇葩,只要对数据库有一定了解都能办到.
那该怎么解决呢,我程序要用到这些操作
解决方案六:
引用4楼weiyf27的回复:
Quote: 引用3楼tcmakebest的回复:
楼主还是不要瞎想了,这种操作本身并不难,只是太奇葩,只要对数据库有一定了解都能办到.那该怎么解决呢,我程序要用到这些操作
2楼的SQL语句是可以直接在程序执行的你将他当作SQL语句去使用就可以了。不要以为SQL真的只有增删改查才可以执行
解决方案七:
引用5楼fei2yun的回复:
2楼的SQL语句是可以直接在程序执行的你将他当作SQL语句去使用就可以了。不要以为SQL真的只有增删改查才可以执行
我把2楼的代码全放在sqlStr里了,为什么dt里没数据呢?DataTabledt=GetDsFromSql(sqlStr).Tables[0];
publicstaticDataSetGetDsFromSql(stringsqlStr){stringstrConnection="...数据库连接正常...";SqlConnectionconn=newSqlConnection(strConnection);DataSetds=newDataSet();try{conn.Open();SqlDataAdapterda=newSqlDataAdapter(sqlStr,conn);da.Fill(ds);}catch(Exceptione){ds.Tables.Add("TempTable");}conn.Close();returnds;}
解决方案八:
--建一个存储过程,然后你在代码里面调用这个存储过程就可以了--返回多个表,每表仅有一行一列,里面的值就是你要的tablenamecreateprocproc_GetTableName@columnvarchar(50),@valuevarchar(50)asbegindeclare@tablevarchar(50)declarecurcursorforselectnamefromsysobjectswheretype='U'opencurfetchnextfromcurinto@tablewhile(@@fetch_status=0)beginif(col_length(@table,@column)isnotnull)begindeclare@sqlnvarchar(4000)declare@resultintset@sql='select@count=count(1)from'+@table+'where'+@column+'like''%'+@value+'%'''execsp_executesql@sql,N'@countintoutput',@resultoutputif(@result>0)beginselect@tableendendfetctnextfromcurinto@tableendclosecurdeallocatecurend
解决方案九:
引用6楼weiyf27的回复:
Quote: 引用5楼fei2yun的回复:
2楼的SQL语句是可以直接在程序执行的你将他当作SQL语句去使用就可以了。不要以为SQL真的只有增删改查才可以执行我把2楼的代码全放在sqlStr里了,为什么dt里没数据呢?DataTabledt=GetDsFromSql(sqlStr).Tables[0];
publicstaticDataSetGetDsFromSql(stringsqlStr){stringstrConnection="...数据库连接正常...";SqlConnectionconn=newSqlConnection(strConnection);DataSetds=newDataSet();try{conn.Open();SqlDataAdapterda=newSqlDataAdapter(sqlStr,conn);da.Fill(ds);}catch(Exceptione){ds.Tables.Add("TempTable");}conn.Close();returnds;}
2楼的是print出来,所以你的代码接收不到.思路是一样的,建立游标从系统表里面读出所有的tablenameselectnamefromsysobjectswheretype='U'然后遍历,判断表是否存在你指定的列if(col_length(@table,@column)isnotnull)最后,有指定列的表,就根据wherecolumnlike'%'+value+'%'去读取是否有指定的指,读取到之后selecttablename出来.
解决方案十:
http://blog.csdn.net/yangyi22/article/details/7555662
解决方案十一:
这是SQL注入的范畴,LZ可以找度娘查查
解决方案十二:
引用8楼BitCoffee的回复:
2楼的是print出来,所以你的代码接收不到.思路是一样的,建立游标从系统表里面读出所有的tablenameselectnamefromsysobjectswheretype='U'然后遍历,判断表是否存在你指定的列if(col_length(@table,@column)isnotnull)最后,有指定列的表,就根据wherecolumnlike'%'+value+'%'去读取是否有指定的指,读取到之后selecttablename出来.
执行7楼代码加Execproc_GetTableName'Name','Zs'吗?
解决方案十三:
引用11楼weiyf27的回复:
Quote: 引用8楼BitCoffee的回复:
2楼的是print出来,所以你的代码接收不到.思路是一样的,建立游标从系统表里面读出所有的tablenameselectnamefromsysobjectswheretype='U'然后遍历,判断表是否存在你指定的列if(col_length(@table,@column)isnotnull)最后,有指定列的表,就根据wherecolumnlike'%'+value+'%'去读取是否有指定的指,读取到之后selecttablename出来.执行7楼代码加Execproc_GetTableName'Name','Zs'吗?
恩,直接proc_GetTableName'Name','Zs'也可以.
解决方案十四:
引用12楼BitCoffee的回复:
恩,直接proc_GetTableName'Name','Zs'也可以.
把代码都放在sql语句里了,可是在测试中dt里还是没数据,在SQLServer查询里,执行结果是“命令已成功完成”
解决方案十五:
别搞那么复杂,直接用下面的,有多少表写多少selectname,'table1'fromtable1wherename=‘Zs’unionallselectname,'table2'fromtable2wherename=‘Zs’unionallselectname,'table3'fromtable3wherename=‘Zs’
解决方案:
1、获取所有数据库名SelectNameFromMaster..SysDatabasesorderByName2、获取所有表名SelectNameFromSysObjectsWhereXType='U'orderByNameXType='U':表示所有用户表;XType='S':表示所有系统表;3、.获取所有字段名SelectNameFromSysColumnsWhereid=Object_Id(‘TableName’)对所有表名的集合中,含有指定字段名的表做查询直到找到你需要的表,或失败你连过程化的查询都不清楚,就去套用不一定正确的存储过程,成功率是极低的
解决方案:
引用14楼xdashewan的回复:
别搞那么复杂,直接用下面的,有多少表写多少selectname,'table1'fromtable1wherename=‘Zs’unionallselectname,'table2'fromtable2wherename=‘Zs’unionallselectname,'table3'fromtable3wherename=‘Zs’
额,数据库的表是动态生成的,有n个
解决方案:
引用15楼xuzuning的回复:
1、获取所有数据库名SelectNameFromMaster..SysDatabasesorderByName2、获取所有表名SelectNameFromSysObjectsWhereXType='U'orderByNameXType='U':表示所有用户表;XType='S':表示所有系统表;3、.获取所有字段名SelectNameFromSysColumnsWhereid=Object_Id(‘TableName’)对所有表名的集合中,含有指定字段名的表做查询直到找到你需要的表,或失败你连过程化的查询都不清楚,就去套用不一定正确的存储过程,成功率是极低的
菜鸟一只,之前数据库只接触过最简单的增删改查。
解决方案:
所以你需要先搞清原理,在动手
解决方案:
引用16楼weiyf27的回复:
额,数据库的表是动态生成的,有n个
表都能动态生成,语句不能动态生成?再不济,你多生成一张表用于记录表名也能办到
解决方案:
谢谢各位大神的热心解答,我再花时间多学习下,试试大神们的方法