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个5个甚至更多。
也就说说表示动态创建的
#7
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
}
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个5个甚至更多。
也就说说表示动态创建的
#7
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
}
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
}