2

複合主キーを持つテーブルがあります。

そのテーブルで更新を行っていますが、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 + "'";

主キー列を取得します。ただし、主キーが複合の場合は失敗します。ここで更新するにはどうすればよいですか?ヘルプ。

4

4 に答える 4

3

次のクエリは、すべての主キー列を取得します。

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);

SQL Fiddle の例

コメントで指摘されているように、パラメータ化されたクエリを使用する必要があります。

于 2013-09-02T07:37:19.977 に答える
1

コマンド オブジェクトを使用して値をパラメーターとして 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();
      }

 }
于 2013-09-02T09:43:01.657 に答える
0
于 2013-09-02T15:18:02.413 に答える