当前位置: 代码迷 >> Sql Server >> SQL如何动态显示列名
  详细解决方案

SQL如何动态显示列名

热度:12   发布时间:2016-04-24 10:13:10.0
SQL怎么动态显示列名
我在A表保存了B表的列名中英文对照,怎么才能在查询B表时显示A表中的中文。B表列是随着A表增长的,就是说A表增加一行,B表就增加一列,所以用静态方法无法实现。
------解决方案--------------------
列出表结构吧
------解决方案--------------------
搞点直观点的数据看看
------解决方案--------------------
是介个意思么?
IF OBJECT_ID('tempdb..#testA','U') IS NOT NULL DROP TABLE #testA
CREATE TABLE #testA
(
ID INT IDENTITY(1,1)
,ColNameEN VARCHAR(20)
,ColNameCN NVARCHAR(200)
)
INSERT INTO #testA
VALUES  ('Col1',N'列名A'),('Col2',N'列名B'),('Col3',N'列名C'),('Col4',N'列名D'),('Col5',N'列名E')

IF OBJECT_ID('tempdb..#testB','U') IS NOT NULL DROP TABLE #testB
CREATE TABLE #testB
(
Col1 VARCHAR(10)
,Col2 VARCHAR(10)
,Col3 VARCHAR(10)
,Col4 VARCHAR(10)
,Col5 VARCHAR(10)
)
INSERT INTO #testB
VALUES  ('A','B','C','D','E'),('1','2','3','4','5')
SELECT * FROM #testB

DECLARE @SqlA NVARCHAR(MAX),@SqlB NVARCHAR(MAX)
SELECT @SqlA=ISNULL(@SqlA+',','')+'['+ColNameEN+']'+' AS ['+ColNameCN+']' FROM #testA 

SELECT @SqlB=N'SELECT '+@SqlA+'
FROM #testB'
EXEC(@SqlB)

/*EN
Col1 Col2 Col3 Col4 Col5
A B C D E
1 2 3 4 5
*/

/*
列名A 列名B 列名C 列名D 列名E
A B C D E
1 2 3 4 5
*/

------解决方案--------------------

declare @str varchar(5000)
, @zd varchar(20)
set @str=''
set @zd=''
declare xx cursor 
for select rtrim(英文)+' as '+rtrim(中文) from A where zd in (select name from syscolumns where id=object_id('B'))
open xx
fetch next from xx into @zd
while @@fetch_status=0
begin
set @str=@str+','+@zd
fetch next from xx into @zd
end
close xx 
deallocate xx
set @str=right(@str,len(@str)-1)
exec('select '+@str+' from B')
------解决方案--------------------
引用:
是介个意思么?
IF OBJECT_ID('tempdb..#testA','U') IS NOT NULL DROP TABLE #testA
CREATE TABLE #testA
(
ID INT IDENTITY(1,1)
,ColNameEN VARCHAR(20)
,ColNameCN NVARCHAR(200)
)
INSERT INTO #testA
VALUES  ('Col1',N'列名A'),('Col2',N'列名B'),('Col3',N'列名C'),('Col4',N'列名D'),('Col5',N'列名E')

IF OBJECT_ID('tempdb..#testB','U') IS NOT NULL DROP TABLE #testB
CREATE TABLE #testB
(
Col1 VARCHAR(10)
,Col2 VARCHAR(10)
,Col3 VARCHAR(10)
,Col4 VARCHAR(10)
,Col5 VARCHAR(10)
)
INSERT INTO #testB
VALUES  ('A','B','C','D','E'),('1','2','3','4','5')
SELECT * FROM #testB

DECLARE @SqlA NVARCHAR(MAX),@SqlB NVARCHAR(MAX)
SELECT @SqlA=ISNULL(@SqlA+',','')+'['+ColNameEN+']'+' AS ['+ColNameCN+']' FROM #testA 

SELECT @SqlB=N'SELECT '+@SqlA+'
FROM #testB'
EXEC(@SqlB)

/*EN
Col1 Col2 Col3 Col4 Col5
A B C D E
1 2 3 4 5
*/

/*
列名A 列名B 列名C 列名D 列名E
A B C D E
1 2 3 4 5
*/


估计是。
  相关解决方案