在SQL SERVER 数据库中如何根据一个字段名去查哪些表里有这个字段

卡卡西 2010-11-03 04:32:00
例如用友财务软件的数据库中有一个字段名是cAssignId 我想知道哪些表里有这个字段。
应该如何做呢?
或者直接解决我的问题也可以。
...全文
2752 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
卡卡西 2010-11-04
  • 打赏
  • 举报
回复
我也查到了这个字段的定义名称

cAssignId 分配规则编号 char 16 False

但是用友的分配规则编号是如何得到的呢?我看了数据库中所有的表,只有InventoryBarCodeSet表中有这个字段,别的表中也没有这个字段呀,如果我要在这个表中用二次开发的软件向里面添加序列号,那么这个字段的值怎么写呢?其它的都没问题,知道数据从哪里调,就是这个字段没找到出处。
--小F-- 2010-11-03
  • 打赏
  • 举报
回复
CREATE PROC sp_ValueSearch
@value sql_variant, --要搜索的数据
@precision bit=1 --1=仅根据sql_variant中的数据类型查找对应类型的数据列.<>1,查询兼容的所有列,字符数据使用like匹配
AS
SET NOCOUNT ON
IF @value IS NULL RETURN

--数据类型处理
SELECT xtype INTO #t FROM systypes
WHERE name=SQL_VARIANT_PROPERTY(@value,N'BaseType')

--扩展数据类型及查询处理语句
DECLARE @sql nvarchar(4000),@sql1 nvarchar(4000)
IF @precision=1
SET @sql=CASE SQL_VARIANT_PROPERTY(@value,N'BaseType')
WHEN N'text' THEN N' LIKE N''%''+CAST(@value as varchar(8000))+''%'''
WHEN N'ntext' THEN N' LIKE ''%''+CAST(@value as nvarchar(4000))+''%'''
ELSE N'=@value' END
ELSE
BEGIN
SET @sql=CAST(SQL_VARIANT_PROPERTY(@value,N'BaseType') as sysname)
IF @sql LIKE N'%char' or @sql LIKE N'%text'
BEGIN
INSERT #t SELECT xtype FROM systypes
WHERE name LIKE N'%char' or name LIKE N'%text'
SELECT @sql=N' LIKE N''%''+CAST(@value as '
+CASE
WHEN LEFT(@sql,1)=N'n' THEN ' nvarchar(4000)'
ELSE 'varchar(8000)' END
+N')+N''%'''
END
ELSE IF @sql LIKE N'%datetime'
BEGIN
INSERT #t SELECT xtype FROM systypes
WHERE name LIKE N'%datetime'
SET @sql=N'=@value'
END
ELSE IF @sql LIKE N'%int'
OR @sql LIKE N'%money'
OR @sql IN(N'real',N'float',N'decimal',N'numeric')
BEGIN
INSERT #t SELECT xtype FROM systypes
WHERE name LIKE N'%int'
OR name LIKE N'%money'
OR name IN(N'real',N'float',N'decimal')
SET @sql=N'=@value'
END
ELSE
SET @sql=N'=@value'
END
--保存结果的临时表
CREATE TABLE #(TableName sysname,FieldName sysname,Type sysname,SQL nvarchar(4000))

DECLARE tb CURSOR LOCAL
FOR
SELECT N'SELECT * FROM '
+QUOTENAME(USER_NAME(o.uid))
+N'.'+QUOTENAME(o.name)
+N' WHERE '+QUOTENAME(c.name)
+@sql,
N'INSERT # VALUES(N'+QUOTENAME(o.name,N'''')
+N',N'+QUOTENAME(c.name,N'''')
+N',N'+QUOTENAME(QUOTENAME(t.name)+CASE
WHEN t.name IN (N'decimal',N'numeric')
THEN N'('+CAST(c.prec as varchar)+N','+CAST(c.scale as varchar)+N')'
WHEN t.name=N'float'
OR t.name like N'%char'
OR t.name like N'%binary'
THEN N'('+CAST(c.prec as varchar)+N')'
ELSE N'' END,N'''')
+N',@sql)'
FROM sysobjects o,syscolumns c,systypes t,#t tt
WHERE o.id=c.id
AND c.xusertype=t.xusertype
AND t.xtype=tt.xtype
AND OBJECTPROPERTY(o.id,N'IsUserTable')=1

OPEN tb
FETCH tb INTO @sql,@sql1
WHILE @@FETCH_STATUS=0
BEGIN
SET @sql1=N'IF EXISTS('+@sql+N') '+@sql1
EXEC sp_executesql @sql1,N'@value sql_variant,@sql nvarchar(4000)',@value,@sql
FETCH tb INTO @sql,@sql1
END
CLOSE tb
DEALLOCATE tb
SELECT * FROM #

exec sp_ValueSearch '要搜索的值',1 --1或不输入(即默认值1)精确匹配
exec sp_ValueSearch '要搜索的值',0 --不等于1,模糊匹配





Create PROC xb_GetTableNameAndColNameForValue
@value varchar(200)
AS
--求test库中包含值为@value的表和列名

--存储表名和列名
IF object_id('tabss') IS NOT NULL
exec('drop table tabss')
CREATE TABLE Tabss(id int identity(1,1),tabname varchar(100),colName varchar(100))

--查询某表某列是否包含某个值
IF object_id('ysgs') IS NOT NULL
exec('drop proc ysgs')
exec('create PROC ysgs(@tab varchar(100),@col varchar(100))
AS
exec(''select 1 from ''+@tab+'' where ''+@col+'' like ''''%'+@value+'%'''''')')

--将结果存入tabss表中
EXEC master.dbo.xp_execresultset 'SELECT ''exec ysgs ''''''+object_name(id)+'''''',''''''+name+'''''';if @@rowcount>0 insert tabss (colname,tabname)values(''''''+name+'''''',''''''+object_name(id)+'''''')'' FROM syscolumns s WHERE xtype in(SELECT xtype FROM systypes s2 WHERE name in(''char'',''varchar'',''nchar'',''nvarchar''))
AND id in(SELECT id FROM sysobjects s2 WHERE xtype=''u'')',N'test'


GO


/*调用
exec xb_GetTableNameAndColNameForValue 'aa_1'
SELECT * FROM tabss
*/


Create PROC getFieldAll(@t VARCHAR(100),@v VARCHAR(20), @f VARCHAR(1000) OUT )
AS
BEGIN
DECLARE @name VARCHAR(40)
DECLARE @S NVARCHAR(1000),@C INT
SET @f='(2006)德旌法协执字第325-1号'

EXEC('declare cur cursor for select name from syscolumns where id=object_id('''+@t+''') and xtype in(SELECT xtype FROM systypes s2 WHERE name in(''char'',''varchar'',''nchar'',''nvarchar''))')

OPEN cur
FETCH NEXT FROM cur INTO @name
WHILE @@FETCH_STATUS=0
BEGIN
SET @S='select @s=count(1) from '+@t+' where ['+@name +'] like ''%'+@v+'%'''
EXEC sp_executesql @S,N'@s int out',@C OUT
IF @C>0
SET @f=@f+@name+','
FETCH NEXT FROM cur INTO @name
END
CLOSE cur
DEALLOCATE cur
RETURN
END

go
EXEC sp_msforeachtable
@command1 = N'declare @l varchar(1000); exec getFieldAll ''?'',''aa_1'',@l out;if @l<>'''' select ''?'' 表名,@l 列名
'
「已注销」 2010-11-03
  • 打赏
  • 举报
回复
用友市场这么广,今天一天见到好几个人问用友产品的问题。
就是just4 2010-11-03
  • 打赏
  • 举报
回复
"有谁知道用友的InventoryBarCodeSet表中的cAssignId字段数据是怎么来的?"
楼主不查数据字典,在数据库中折腾啥,以为是kingdee?

[Quote=引用]
InventoryBarCodeSet Table (ST 库存管理)

cInvCode 存货编码 varchar 30 False
cBarCode 条码 varchar 200 False
cRuleId 条码规则编号 char 16 False
cAssignId 分配规则编号 char 16 False
cInvName 存货名称 varchar 60 True
cInvCCode 存货大类编码 varchar 12 True
cInvCName 存货大类名称 char 20 True
cFree1 存货自由项1 varchar 20 True
cFree2 存货自由项2 varchar 20 True
cFree3 存货自由项3 varchar 20 True
cFree4 存货自由项4 varchar 20 True
...

RuleAssign Table (ST 库存管理)

assignId 分配规则编号 char 16 False
assignType 分配规则类型 smallint 2 False
invId 存货编码 char 30 True
classId 存货大类编码 char 12 True
ruleId 条码规则编码 char 16 False

[/Quote]

cAssignId 分配规则编号 char 16 False
claro 2010-11-03
  • 打赏
  • 举报
回复
SQL2005及以上版本,执行
select object_definition(OBJECT_ID('InventoryBarCodeSet'))
claro 2010-11-03
  • 打赏
  • 举报
回复
sp_helptext 'InventoryBarCodeSet'
claro 2010-11-03
  • 打赏
  • 举报
回复
不了解。

王向飞 2010-11-03
  • 打赏
  • 举报
回复
你打开监控一下不就知道怎么来的了吗。
profiler
卡卡西 2010-11-03
  • 打赏
  • 举报
回复
有谁知道用友的InventoryBarCodeSet表中的cAssignId字段数据是怎么来的?
卡卡西 2010-11-03
  • 打赏
  • 举报
回复
按你们的方法查到了这个表,但是是我已经知道的表,我想查的就是其它有这个字段的表,这样看来,只有我当前这个表中有这个字段,但是它的一大长串数据是哪里来的呢?如“1011031054220482”没有什么输入的地方啊,是用哪个字段的数据经过什么算法计算出来的吗?
幸运的意外 2010-11-03
  • 打赏
  • 举报
回复
这个要结合两个表来进行查找一个是sysobjects一个是syscolumns。他们有个共同的字段是id来进行联系。查询的代码如下:
SELECT *
FROM sysobjects s
WHERE
TYPE='u'
AND
id IN(SELECT id
FROM syscolumns s
WHERE s.name='待查找字段名')
王向飞 2010-11-03
  • 打赏
  • 举报
回复
你确定你只是要找字段,而不是要找数据内容?
他们没给你一个数据字典吗??貌似有2000多张表。
「已注销」 2010-11-03
  • 打赏
  • 举报
回复
SELECT * FROM sysobjects s
WHERE TYPE='u'
AND id IN(
SELECT id FROM syscolumns s
WHERE s.[name]='你的字段名')
jamk 2010-11-03
  • 打赏
  • 举报
回复

a.name 为字段,b.name 为表

select a.name,b.name from syscolumns a inner join sysobjects b on a.id=b.id
where a.name = 'cAssignId'

上面单引号打错~
jamk 2010-11-03
  • 打赏
  • 举报
回复

a.name 为字段,b.name 为表

select a.name,b.name from syscolumns a inner join sysobjects b on a.id=b.id
where a.name = ‘cAssignId'
jamk 2010-11-03
  • 打赏
  • 举报
回复
select    *   from   syscolumns   where   name=   'id '

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧