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

时间:2022-10-01 15:06:36
例如用友财务软件的数据库中有一个字段名是cAssignId  我想知道哪些表里有这个字段。
应该如何做呢?
或者直接解决我的问题也可以。

16 个解决方案

#1


select    *   from   syscolumns   where   name=   'id '

#2



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' 

#3



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'

上面单引号打错~

#4


SELECT * FROM sysobjects s
WHERE TYPE='u'
AND id IN(
SELECT id FROM syscolumns s 
WHERE s.[name]='你的字段名')

#5


你确定你只是要找字段,而不是要找数据内容?
他们没给你一个数据字典吗??貌似有2000多张表。 在SQL SERVER 数据库中如何根据一个字段名去查哪些表里有这个字段

#6


这个要结合两个表来进行查找一个是sysobjects一个是syscolumns。他们有个共同的字段是id来进行联系。查询的代码如下:
SELECT * 
FROM sysobjects s
WHERE 
    TYPE='u'
AND 
    id IN(SELECT id 
           FROM syscolumns s 
           WHERE s.name='待查找字段名')

#7


按你们的方法查到了这个表,但是是我已经知道的表,我想查的就是其它有这个字段的表,这样看来,只有我当前这个表中有这个字段,但是它的一大长串数据是哪里来的呢?如“1011031054220482”没有什么输入的地方啊,是用哪个字段的数据经过什么算法计算出来的吗?

#8


有谁知道用友的InventoryBarCodeSet表中的cAssignId字段数据是怎么来的?

#9


你打开监控一下不就知道怎么来的了吗。
profiler

#10


不了解。

#11


sp_helptext 'InventoryBarCodeSet'

#12


SQL2005及以上版本,执行
select object_definition(OBJECT_ID('InventoryBarCodeSet'))

#13


"有谁知道用友的InventoryBarCodeSet表中的cAssignId字段数据是怎么来的?"
楼主不查数据字典,在数据库中折腾啥,以为是kingdee?

引用
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  


cAssignId 分配规则编号  char 16  False 

#14


用友市场这么广,今天一天见到好几个人问用友产品的问题。

#15


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 列名
        '

#16


我也查到了这个字段的定义名称

cAssignId 分配规则编号 char 16 False

但是用友的分配规则编号是如何得到的呢?我看了数据库中所有的表,只有InventoryBarCodeSet表中有这个字段,别的表中也没有这个字段呀,如果我要在这个表中用二次开发的软件向里面添加序列号,那么这个字段的值怎么写呢?其它的都没问题,知道数据从哪里调,就是这个字段没找到出处。

#1


select    *   from   syscolumns   where   name=   'id '

#2



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' 

#3



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'

上面单引号打错~

#4


SELECT * FROM sysobjects s
WHERE TYPE='u'
AND id IN(
SELECT id FROM syscolumns s 
WHERE s.[name]='你的字段名')

#5


你确定你只是要找字段,而不是要找数据内容?
他们没给你一个数据字典吗??貌似有2000多张表。 在SQL SERVER 数据库中如何根据一个字段名去查哪些表里有这个字段

#6


这个要结合两个表来进行查找一个是sysobjects一个是syscolumns。他们有个共同的字段是id来进行联系。查询的代码如下:
SELECT * 
FROM sysobjects s
WHERE 
    TYPE='u'
AND 
    id IN(SELECT id 
           FROM syscolumns s 
           WHERE s.name='待查找字段名')

#7


按你们的方法查到了这个表,但是是我已经知道的表,我想查的就是其它有这个字段的表,这样看来,只有我当前这个表中有这个字段,但是它的一大长串数据是哪里来的呢?如“1011031054220482”没有什么输入的地方啊,是用哪个字段的数据经过什么算法计算出来的吗?

#8


有谁知道用友的InventoryBarCodeSet表中的cAssignId字段数据是怎么来的?

#9


你打开监控一下不就知道怎么来的了吗。
profiler

#10


不了解。

#11


sp_helptext 'InventoryBarCodeSet'

#12


SQL2005及以上版本,执行
select object_definition(OBJECT_ID('InventoryBarCodeSet'))

#13


"有谁知道用友的InventoryBarCodeSet表中的cAssignId字段数据是怎么来的?"
楼主不查数据字典,在数据库中折腾啥,以为是kingdee?

引用
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  


cAssignId 分配规则编号  char 16  False 

#14


用友市场这么广,今天一天见到好几个人问用友产品的问题。

#15


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 列名
        '

#16


我也查到了这个字段的定义名称

cAssignId 分配规则编号 char 16 False

但是用友的分配规则编号是如何得到的呢?我看了数据库中所有的表,只有InventoryBarCodeSet表中有这个字段,别的表中也没有这个字段呀,如果我要在这个表中用二次开发的软件向里面添加序列号,那么这个字段的值怎么写呢?其它的都没问题,知道数据从哪里调,就是这个字段没找到出处。