2013-05-10 92 views
0

我有表名作为@Table_Name如何在不知道列名的情况下获取列值? SQL Server的

我列值@Value,但没有列名(但存在于第一的位置,并且可以Seek_id或prov_id ......我要比较我的价值与此ID)

我怎样才能比较该表的列名称值?

我想是这样

SELECT * FROM @Table_Name 
WHERE Table.Column[1].Value = @Value 

例如@Table_Name = bb_match@Value = 6

+2

你不能这样做 - SQL Server需要一个列名 - 它不能使用序号位置来引用表中的一列 – 2013-05-10 10:08:28

+1

你可能可以使用一些动态SQL查询sys.columns来查找第一列 – Jaloopa 2013-05-10 10:09:44

+0

你可以使用INFORMATION_SCHEMA.COLUMNS表中的ordinal_position字段查找给定表的第一列。 – Maximus 2013-05-10 10:18:29

回答

2

这可能是有益的你 -

查询:

IF OBJECT_ID (N'dbo.bb_match') IS NOT NULL 
    DROP TABLE dbo.bb_match 

CREATE TABLE dbo.bb_match (seek_id INT, prov_id INT) 

INSERT INTO dbo.bb_match (seek_id, prov_id) 
VALUES (6, 1), (2, 6) 

DECLARE 
     @ColumnID TINYINT 
    , @Value INT 
    , @TableName SYSNAME 
    , @SQL NVARCHAR(500) 

SELECT 
     @ColumnID = 1 
    , @Value = 6 
    , @TableName = 'dbo.bb_match' 

SELECT @SQL = 'SELECT * FROM ' + @TableName + ' WHERE [' + c.name + '] = ' + CAST(@Value AS NVARCHAR(MAX)) 
FROM sys.objects o WITH (NOWAIT) 
JOIN sys.schemas s WITH (NOWAIT) ON o.[schema_id] = s.[schema_id] 
JOIN sys.columns c WITH (NOWAIT) ON o.[object_id] = c.[object_id] 
WHERE o.[type] = 'U' -- <-- only for tables columns 
    AND s.name + '.' + o.name = @TableName 
    AND c.column_id = @ColumnID 

PRINT @SQL 

EXEC sp_executesql @SQL 

短,但不安全(SYS.COLUMNS包含列名的表,视图,存储过程,...):

SELECT @SQL = 'SELECT * FROM ' + @TableName + ' WHERE [' + c.name + '] = ' + CAST(@Value AS NVARCHAR(MAX)) 
FROM sys.columns c WITH (NOWAIT) 
WHERE c.[object_id] = OBJECT_ID(@TableName) 
    AND c.column_id = @ColumnID 

EXEC sys.sp_executesql @SQL

输出:

SELECT * FROM dbo.bb_match WHERE [seek_id] = 6 

结果:

seek_id  prov_id 
----------- ----------- 
6   1 
+0

这不显示记录/结果.... onlu显示列名称 – user2369561 2013-05-10 10:16:18

+0

您在哪里指定了列位置。他想要将该值与第一列进行比较。 – Maximus 2013-05-10 10:16:33

+0

我有表名* table_Name和列值*值不列名称...我如何搜索* table_Name我知道列位置是1st(表中的第一列)..... – user2369561 2013-05-10 10:20:04

0
declare @sql varchar(MAX) 
declare @tablename varchar(100) = 'MyTable' --add your table name here 
declare @value varchar(100) = 'SomeValue' -- add your desired value hree 

select @sql = 'SELECT * FROM ' + @tablename + ' WHERE ' 
+ name 
+ ' = ''' + @value + '''' 
from sys.columns where object_id = object_id(@tablename) and column_id = 1 

exec (@sql) 

这有三个部分。首先我要宣布三个字符串。 @sql是我将建立查询的地方,@tablename@value是查找/查找的表和搜索值。我已经输入了虚拟值MyTable和SomeValue来显示我在说什么

接下来我构建了sql语句。第一行设置的字符串作为SELECT * FROM MyTable WHERE

我然后在列名通过从SQL Server系统表sys.columns选择名称,过滤在所述第一柱(column_id = 1)和表名添加

下一步是在列中添加我们想要搜索的值。

最后,EXEC(@sql)将字符串解释为命令并运行它。

+0

谢谢jaloopa ....但出现错误消息137,级别15,状态1,行2 必须声明标量变量“@sql”。 消息137,级别15,状态2,行7 必须声明标量变量“@sql”。 – user2369561 2013-05-10 10:43:30

+0

选择@sql = 'SELECT * FROM' + bb_match + '其中' +命名 + '=' + 8 从SYS.COLUMNS其中的object_id =的object_id( '的TControl')和COLUMN_ID = 1 EXEC(@sql ) – user2369561 2013-05-10 10:43:48

+0

对于我来说这个问题的解决方案非常紧迫 – user2369561 2013-05-10 10:47:23

相关问题