SQL查询 返回表名和字段名的组合 表名.字段名

时间:2022-06-30 09:29:13

select Name From SysColumns Where ID=Object_Id('表名')
这句话是返回该表的所有字段名

假设现在有3个表 表结构如下 
A表: ID, Name, Age, Address
B表: ID, CustomerName
C表: ID, Amount

现在我要把三个表的所有字段返回 并显示为如下结构
A.ID, Name, Age, Address,B.ID, CustomerName,C.ID, Amount

也就是说字段没有重复的可以不管,当字段有重复的时候,比如ID就是重复的我们需要把表名添加到前面。

请问下怎么实现,如果有具体的代码最好了,我准备拿70分来奖励。只要是满意的就给70分!

8 个解决方案

#1


你是想怎么查询呢

#2


是从sys.columns表中取?

#3



declare @sql varchar(max) set @sql=''
select @sql=@sql+'a.'+name+', ' from syscolumns where id=object_id('A表')
select @sql=@sql+'b.'+name+', ' from syscolumns where id=object_id('B表')
select @sql=@sql+'c.'+name+', ' from syscolumns where id=object_id('C表')
select left(@sql,len(@sql)-2)
/*
a.ID, a.NAME, a.Age, a.ADDRESS, b.ID, b.CustomerName, c.ID, c.Amount
*/

#4



/*
CREATE TABLE A表
    (
      ID INT ,
      NAME VARCHAR(10) ,
      Age INT ,
      ADDRESS VARCHAR(20)
    )
go
CREATE TABLE B表
    (
      ID INT ,
      CustomerName VARCHAR(20)
    )
go
CREATE TABLE C表
    (
      ID INT ,
      Amount VARCHAR(20)
    )

*/
--作为列名,防止重复的话,可以这样
declare @sql varchar(max) set @sql=''
select @sql=@sql+'a.'+name+' as a'+name+', ' from syscolumns where id=object_id('A表')
select @sql=@sql+'b.'+name+' as b'+name+', ' from syscolumns where id=object_id('B表')
select @sql=@sql+'c.'+name+' as c'+NAME+', ' from syscolumns where id=object_id('C表')
select left(@sql,len(@sql)-2)
/*
a.ID as aID, a.NAME as aNAME, a.Age as aAge, a.ADDRESS as aADDRESS, b.ID as bID, b.CustomerName as bCustomerName, c.ID as cID, c.Amount as cAmount
*/

#5


不好意思各位  我忘了补充了 表的个数是没有限制的 不止三个,有可能有4个5个甚至更多。

也就说说表示动态创建的

#6


引用 4 楼 maco_wang 的回复:
SQL code
?



1234567891011121314151617181920212223242526272829303132

/* CREATE TABLE A表     (       ID INT ,       NAME VARCHAR(10) ,       Age INT ,       ADDRESS VARCHAR(20)     ) go CREATE……


不好意思各位  我忘了补充了 表的个数是没有限制的 不止三个,有可能有4个5个甚至更多。

也就说说表示动态创建的 

#7


引用 6 楼 chenxu7601257 的回复:
引用 4 楼 maco_wang 的回复:SQL code
?



1234567891011121314151617181920212223242526272829303132

/* CREATE TABLE A表     (       ID INT ,       NAME VARCHAR(10) ,       Age INT ,       A……



GO
CREATE FUNCTION dbo.GetColNameStr
    (
      @name VARCHAR(100) ,
      @colname VARCHAR(1000)
    )
RETURNS VARCHAR(1000)
    BEGIN
        DECLARE @sql VARCHAR(MAX)
        SET @sql = ''
        SELECT  @sql = @sql + @colname + '.' + name + ', '
        FROM    syscolumns
        WHERE   id = OBJECT_ID(@name)
        SET @sql = LEFT(@sql, LEN(@sql) - 2)
        RETURN @sql
    END 
    
GO
SELECT  dbo.GetColNameStr(name,
                          't' + LTRIM(ROW_NUMBER() OVER ( ORDER BY ( SELECT
                                                              1
                                                              ) )))
FROM    sysobjects
WHERE   type = 'u'


先创建函数,然后你看一下下面的结果。

然后再定义变量把结果放在一个行就可以了,同#3。

#8


一.如果返回一个列表:
select TABLE_NAME+'.'+COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME in ('','','') 
别用SYSCOLUMNS
二.如果返回一个字串,这个问题稍微复杂一点(且表的字段不能太多,要不然会超出SQL限制)
现在的问题不是怎么查的问题,而是如何将字串合并的问题,找到这些表名和字段名是不费吹灰之力的,关键是找到后如何合并字串的问题,MSDN和网上都有这段STRJOIN的代码,我就拷贝给你吧:
1.将下述代码放入VS生成发布到你的数据库里,将会自动多出一个STRJOIN的聚合函数
2.select dbo.strjoin(TABLE_NAME+'.'+COLUMN_NAME) from INFORMATION_SCHEMA.COLUMNS 
where TABLE_NAME in ('','','') 

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Text;

[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.UserDefined, 
    IsInvariantToDuplicates=false,
    IsInvariantToNulls=true,
    IsInvariantToOrder=false,
    IsNullIfEmpty=true,
    MaxByteSize=8000
)]
public struct StrJoin: IBinarySerialize {
    private StringBuilder _result;

    public void Init() {
        _result = new StringBuilder();
    }

    public void Accumulate(SqlString Value) {
        if (Value.IsNull) {
            return;
        } else {
            if (_result.Length > 0)
                _result.Append(",");
            _result.Append(Value.Value);
        }
    }

    public void Merge(StrJoin Group) {
        _result.Append(Group._result);
    }

    public SqlString Terminate() {
        if (_result.Length > 0) {
            return new SqlString(_result.ToString());
        }
        return new SqlString("");
    }

    #region IBinarySerialize Members

    public void Read(System.IO.BinaryReader r) {
        _result = new StringBuilder(r.ReadString());
    }

    public void Write(System.IO.BinaryWriter w) {
        w.Write(_result.ToString());
    }

    #endregion
}

#1


你是想怎么查询呢

#2


是从sys.columns表中取?

#3



declare @sql varchar(max) set @sql=''
select @sql=@sql+'a.'+name+', ' from syscolumns where id=object_id('A表')
select @sql=@sql+'b.'+name+', ' from syscolumns where id=object_id('B表')
select @sql=@sql+'c.'+name+', ' from syscolumns where id=object_id('C表')
select left(@sql,len(@sql)-2)
/*
a.ID, a.NAME, a.Age, a.ADDRESS, b.ID, b.CustomerName, c.ID, c.Amount
*/

#4



/*
CREATE TABLE A表
    (
      ID INT ,
      NAME VARCHAR(10) ,
      Age INT ,
      ADDRESS VARCHAR(20)
    )
go
CREATE TABLE B表
    (
      ID INT ,
      CustomerName VARCHAR(20)
    )
go
CREATE TABLE C表
    (
      ID INT ,
      Amount VARCHAR(20)
    )

*/
--作为列名,防止重复的话,可以这样
declare @sql varchar(max) set @sql=''
select @sql=@sql+'a.'+name+' as a'+name+', ' from syscolumns where id=object_id('A表')
select @sql=@sql+'b.'+name+' as b'+name+', ' from syscolumns where id=object_id('B表')
select @sql=@sql+'c.'+name+' as c'+NAME+', ' from syscolumns where id=object_id('C表')
select left(@sql,len(@sql)-2)
/*
a.ID as aID, a.NAME as aNAME, a.Age as aAge, a.ADDRESS as aADDRESS, b.ID as bID, b.CustomerName as bCustomerName, c.ID as cID, c.Amount as cAmount
*/

#5


不好意思各位  我忘了补充了 表的个数是没有限制的 不止三个,有可能有4个5个甚至更多。

也就说说表示动态创建的

#6


引用 4 楼 maco_wang 的回复:
SQL code
?



1234567891011121314151617181920212223242526272829303132

/* CREATE TABLE A表     (       ID INT ,       NAME VARCHAR(10) ,       Age INT ,       ADDRESS VARCHAR(20)     ) go CREATE……


不好意思各位  我忘了补充了 表的个数是没有限制的 不止三个,有可能有4个5个甚至更多。

也就说说表示动态创建的 

#7


引用 6 楼 chenxu7601257 的回复:
引用 4 楼 maco_wang 的回复:SQL code
?



1234567891011121314151617181920212223242526272829303132

/* CREATE TABLE A表     (       ID INT ,       NAME VARCHAR(10) ,       Age INT ,       A……



GO
CREATE FUNCTION dbo.GetColNameStr
    (
      @name VARCHAR(100) ,
      @colname VARCHAR(1000)
    )
RETURNS VARCHAR(1000)
    BEGIN
        DECLARE @sql VARCHAR(MAX)
        SET @sql = ''
        SELECT  @sql = @sql + @colname + '.' + name + ', '
        FROM    syscolumns
        WHERE   id = OBJECT_ID(@name)
        SET @sql = LEFT(@sql, LEN(@sql) - 2)
        RETURN @sql
    END 
    
GO
SELECT  dbo.GetColNameStr(name,
                          't' + LTRIM(ROW_NUMBER() OVER ( ORDER BY ( SELECT
                                                              1
                                                              ) )))
FROM    sysobjects
WHERE   type = 'u'


先创建函数,然后你看一下下面的结果。

然后再定义变量把结果放在一个行就可以了,同#3。

#8


一.如果返回一个列表:
select TABLE_NAME+'.'+COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME in ('','','') 
别用SYSCOLUMNS
二.如果返回一个字串,这个问题稍微复杂一点(且表的字段不能太多,要不然会超出SQL限制)
现在的问题不是怎么查的问题,而是如何将字串合并的问题,找到这些表名和字段名是不费吹灰之力的,关键是找到后如何合并字串的问题,MSDN和网上都有这段STRJOIN的代码,我就拷贝给你吧:
1.将下述代码放入VS生成发布到你的数据库里,将会自动多出一个STRJOIN的聚合函数
2.select dbo.strjoin(TABLE_NAME+'.'+COLUMN_NAME) from INFORMATION_SCHEMA.COLUMNS 
where TABLE_NAME in ('','','') 

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Text;

[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.UserDefined, 
    IsInvariantToDuplicates=false,
    IsInvariantToNulls=true,
    IsInvariantToOrder=false,
    IsNullIfEmpty=true,
    MaxByteSize=8000
)]
public struct StrJoin: IBinarySerialize {
    private StringBuilder _result;

    public void Init() {
        _result = new StringBuilder();
    }

    public void Accumulate(SqlString Value) {
        if (Value.IsNull) {
            return;
        } else {
            if (_result.Length > 0)
                _result.Append(",");
            _result.Append(Value.Value);
        }
    }

    public void Merge(StrJoin Group) {
        _result.Append(Group._result);
    }

    public SqlString Terminate() {
        if (_result.Length > 0) {
            return new SqlString(_result.ToString());
        }
        return new SqlString("");
    }

    #region IBinarySerialize Members

    public void Read(System.IO.BinaryReader r) {
        _result = new StringBuilder(r.ReadString());
    }

    public void Write(System.IO.BinaryWriter w) {
        w.Write(_result.ToString());
    }

    #endregion
}