【问题标题】:How to get PRIMARY KEY COLUMNS of a table (in case of COMPOSITE primary key)如何获取表的 PRIMARY KEY COLUMNS(在 COMPOSITE 主键的情况下)
【发布时间】:2013-09-02 06:31:32
【问题描述】:

我有一个包含复合主键的表。

我正在对该表进行更新,并且在 where 子句中我需要主列的名称。 直到现在我一直在使用:

 string sql = "SELECT PrimaryColumnName = col.column_name
               FROM information_schema.table_constraints tc
                 INNER JOIN information_schema.key_column_usage col
                   ON col.Constraint_Name = tc.Constraint_Name 
                     AND col.Constraint_schema = tc.Constraint_schema
               WHERE tc.Constraint_Type = 'Primary Key'
                 AND col.Table_name = '" + TABLE NAME HERE + "'";

获取主键列。但是,如果主键是复合的,它就会失败。 我如何在这里进行更新? 帮助。

【问题讨论】:

标签: c# sql sql-server primary-key


【解决方案1】:

以下查询将获取所有主键列:

SELECT  c.Name
FROM    [sys].[index_columns] ic
        INNER JOIN [sys].[columns] c
            ON ic.[object_id] = c.[object_id]
            AND ic.[column_id] = c.[column_id]
        INNER JOIN [sys].[indexes] i
            ON i.[object_id] = ic.[object_id]
            AND i.[index_id] = ic.[index_id]
WHERE   i.is_primary_key = 1
AND     ic.[object_id] = OBJECT_ID(@ObjectName);

Example on SQL Fiddle

正如评论中所述,您应该使用参数化查询。

【讨论】:

  • 谢谢,我正用头撞墙寻找此信息
【解决方案2】:

使用命令对象将值作为参数传递给 SQL 语句,提供类型检查和验证

using (SqlConnection conn = new SqlConnection(sqlBuilder.ConnectionString))
{
      string schemaName = "yourSchemaName";
      string tableName = "yourTableName";
      SqlCommand command = new SqlCommand(@"
        SELECT column_name
        FROM information_schema.key_column_usage
        WHERE TABLE_SCHEMA = @schemaName AND TABLE_NAME = @tableName
          AND OBJECTPROPERTY(object_id(constraint_name), 'IsPrimaryKey') = 1
        ORDER BY table_schema, table_name", conn);
      command.Parameters.Add("@schemaName", SqlDbType.VarChar, 100).Value = schemaName;
      command.Parameters.Add("@tableName", SqlDbType.VarChar, 100).Value = tableName;
      conn.Open();                
      SqlDataReader reader = command.ExecuteReader();
      try
      {                    
          while (reader.Read())
          {
              Console.WriteLine(reader[0]);
          }
      }

      finally
      {
          reader.Close();
      }

 }

【讨论】:

  • USE PARAMETERIZED QUERIES! 提倡使用String.Format 构建查询可不是什么好建议!此行 Console.WriteLine(String.Format("{0}", reader[0])); 也可以缩短为 Console.WriteLine(reader[0]);
  • @GarethD 说得好! String.Format 替换为 SqlParameter 对象。谢谢
【解决方案3】:

选择表名 然后按 Alt+F1 您将获得所需的所有详细信息。

【讨论】:

    【解决方案4】:

    您的查询似乎没问题。我已经对其进行了测试,它返回了包含主键的所有列。

    尝试在 SSMS 中运行它,你会得到两个

    CREATE TABLE dbo.T1
    (
        ID int NOT NULL,
        SomeTextColumn nvarchar(30) NOT NULL,
        SomeColumn nvarchar(20),
        SomeOtherColumn uniqueidentifier,
        CONSTRAINT [PK_T1] PRIMARY KEY CLUSTERED (ID, SomeTextColumn)
    )
    
    
     SELECT PrimaryColumnName = col.column_name 
     FROM information_schema.table_constraints tc 
     INNER JOIN information_schema.key_column_usage col ON col.Constraint_Name = tc.Constraint_Name 
     AND col.Constraint_schema = tc.Constraint_schema 
     WHERE tc.Constraint_Type = 'Primary Key' AND col.Table_name = 'T1'
    

    这是一个SQL Fiddle 示例。

    如果您需要按列过滤,您可以随时添加“and col.COLUMN_NAME = 'ID'”

    【讨论】:

      猜你喜欢
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      • 2016-11-12
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多