INFORMATION_SCHEMA.COLUMNS从表sql server中选择

时间:2015-04-24 08:53:18

标签: sql-server sql-server-2008 sql-server-2012

我正在尝试创建一个正常的sql查询,动态调用某个表中的列。我已经阅读了一些关于如何使用INFORMATION_SCHEMA.COLUMNS获取列列表的论坛,但我想从INFORMATION_SCHEMA.COLUMNS from my table中选择列。

例如:

SELECT (SELECT TOP 1 COLUMN_NAME
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = N'OPOR' AND LEFT(COLUMN_NAME, 2) = 'U_') FROM OPOR

但它只返回列名。不是我表中此列的值。所以我的问题是,是否可以从INFORMATION_SCHEMA.COLUMNS返回值并从我的表中选择它?我的示例列是U_NewColumn。所以结果应该是:SELECT U_NewColumn FROM OPOR

1 个答案:

答案 0 :(得分:5)

当您想构建一个动态查询时,

INFORMATION_SCHEMA.COLUMNS非常有用,您可以根据自己的过滤器获取表/列的列表。在你的情况下。你想要做的是创建一个动态sql,你想要获取从U_

开始的第一列的数据

你会做这样的事情。

DECLARE @Variable NVARCHAR(200) = 'SELECT '
SELECT TOP 1 @Variable = @Variable + QUOTENAME(COLUMN_NAME,']') + ' FROM ' + QUOTENAME(TABLE_NAME,']')
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'OPOR' AND LEFT(COLUMN_NAME, 2) = 'U_'

EXEC sp_executeSQL @Variable

如果你想要多个列,你可以这样做

DECLARE @TableName NVARCHAR(100) = 'OPOR'
DECLARE @Variable NVARCHAR(200)
SELECT @Variable = 'SELECT ' + STUFF((
SELECT', ' + QUOTENAME(COLUMN_NAME,']')
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @TableName AND LEFT(COLUMN_NAME, 2) = 'U_'
FOR XML PATH(''), TYPE).value('.','NVARCHAR(MAX)'),1,1,'') + ' FROM ' + @TableName


PRINT  @Variable
EXEC sp_executeSQL @Variable