【问题标题】:How to get Column value without knowing column name ? SQL Server如何在不知道列名的情况下获取列值? SQL 服务器
【发布时间】:2013-05-04 23:49:02
【问题描述】:

我的表名是@Table_Name

我的列值为@Value,但没有列名(但存在于第一个位置,可以是 Seek_id 或 prov_id ...我必须将我的值与此 id 进行比较)

如何比较该表的列名值?

我想要类似的东西

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

例如@Table_Name = bb_match@Value = 6

【问题讨论】:

  • 你不能这样做 - SQL Server 需要一个列名 - 它不能使用序数位置来引用表中的列
  • 你可以使用一些动态SQL查询sys.columns来找到第一列
  • 您可以使用 INFORMATION_SCHEMA.COLUMNS 表中的 ordinal_position 字段来查找给定表的第一列。
  • 这接近我的解决方案但不显示值只显示该行的列名..(由我的朋友发送):
  • DECLARE @column_name varchar(20) set *column_name = (SELECT top 1 column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'bb_match') select * from bb_match where *column_name = '8' (*=@ )

标签: sql sql-server stored-procedures sysobjects


【解决方案1】:

这可能对你有帮助 -

查询:

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 包含表、视图、过程...的 column_name):

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

执行 sys.sp_executesql @SQL

输出:

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

结果:

seek_id     prov_id
----------- -----------
6           1

【讨论】:

  • 你在哪里指定了列位置。他想将值与第一列进行比较。
  • 我有表名 *table_Name 和列值 *value 而不是列名 ...我如何在 *table_Name 中搜索我知道列位置是第 1 列(表中的第 1 列).....
  • 我有一个值,我必须与表中的第一列进行比较,即 id(名称类似于 seek_id 或 prov_id)
  • Devart 感谢您的回答 ...SELECT * FROM dbo.bb_match WHERE [seek_id] = 6 (但我的列 ID 不是 seek_id ....可以是任何想像 seek_id 或 prov_id )意味着我将在任何表中搜索...第 1 列值我只有表名 ....和第 1 列的 campare 值但不知道第 1 列名称..请帮助我..非常紧急
  • 伊皮! &欢迎您@user2369561 :)))。如果此解决方案完全适合您,如果您能确认,我将很高兴。
【解决方案2】:
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) 将字符串解释为命令并运行它。

【讨论】:

  • 感谢 jaloopa .... 但收到错误消息 137,级别 15,状态 1,行 2 必须声明标量变量“@sql”。 Msg 137, Level 15, State 2, Line 7 必须声明标量变量“@sql”。
  • select @sql = 'SELECT * FROM ' + bb_match + ' WHERE ' + name + ' = ' + 8 from sys.columns where object_id = object_id('TCONTROL') and column_id = 1 exec ( @sql)
  • 必须声明标量变量“@sql”意味着你没有包含第一行。填写所需的表名和值并运行整个脚本
  • 我已经修改了查询并添加了一些解释。如果您想查看最终查询的样子,请将 EXEC(@sql) 替换为 SELECT @sql
猜你喜欢
  • 2013-02-24
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-14
  • 2015-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多