【问题标题】:Getting the PrimaryKey from a table从表中获取 PrimaryKey
【发布时间】:2013-03-13 13:49:24
【问题描述】:

我正在尝试使用该表的主键从数据库中获取数据。问题是每个表的主键名称会不同。

例如,用户可能想拉起员工表,主键是 Emp_ID。然后他们想调出制造商表,主键是 Manu_ID。

由于信息是在同一个 ViewModel 中提取的,所以一切都需要是动态的。

这是查看制造商表的 SQL 语句:

C#:

string strSQLconnection = (connectionString);
SqlConnection sqlConnection = new SqlConnection(strSQLconnection);

tableName = tableName + "AuditLogView";

sqlConnection.Open();
SqlCommand sqlCommand = new SqlCommand("SELECT *  FROM @tableName WHERE ManufacturersID = @primarykey", sqlConnection);
sqlCommand.Parameters.AddWithValue("@tablename", tableName);
sqlCommand.Parameters.AddWithValue("@primarykey", primaryKeyID);

SqlDataReader reader = sqlCommand.ExecuteReader();

其中一些已经动态实现,例如来自用户的主键和表名。我想如果我总能在我的表中找到主键,那么它应该可以工作。有没有办法做到这一点?我正在使用 SQL Server 2008 R2。任何帮助表示赞赏。

【问题讨论】:

  • 您使用的是哪个 DBMS?
  • 是否需要考虑主键为多列的表?在许多数据库系统中,主键不必是单个列。
  • 数据库对象(表、存储过程或任何其他对象)不能作为参数传递。只有列或变量的实际值才能作为参数。您需要动态构建 SQL 语句。
  • 要获取一个表的PK,可以基于以下stackoverflow.com/questions/1373549/…
  • @EricLippert 我不需要考虑这一点。它们的设置都是一样的。

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


【解决方案1】:

那么,您想创建一个接受表名和列名作为参数的通用查询吗?

试试这个:

首先,创建一个存储过程,这个存储过程会根据参数创建通用查询。

-- @tabName = table name
-- @colName = column name
-- @colVal = column value
create proc p1 @tabName varchar(100), @colName varchar(100), @colVal varchar(100)
as
begin
    declare @sql nvarchar(max) = N'select * from ' + @tabName + ' where ' + @colName + ' = ''' + @colVal + ''''
    exec sp_executesql @sql 
end

然后,从您的代码中调用该存储过程:

string strSQLconnection = (connectionString);
SqlConnection sqlConnection = new SqlConnection(strSQLconnection);
sqlConnection.Open();
SqlCommand sqlCommand = new SqlCommand("p1", sqlConnection);
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlCommand.Parameters.AddWithValue("@tabName", "table1");
sqlCommand.Parameters.AddWithValue("@colName", "col1");
sqlCommand.Parameters.AddWithValue("@colVal", "1");        

SqlDataReader reader = sqlCommand.ExecuteReader();


sqlConnection.Close();

【讨论】:

    【解决方案2】:

    此查询将获得 pkey 列名:

    SELECT 
        cu.CONSTRAINT_NAME, 
        cu.COLUMN_NAME 
    FROM 
        INFORMATION_SCHEMA.KEY_COLUMN_USAGE cu 
    WHERE 
        EXISTS 
            (
                SELECT tc.* 
                FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc 
                WHERE 
                    tc.CONSTRAINT_CATALOG = 'dbName' 
                    AND tc.TABLE_NAME = 'tableName' 
                    AND tc.CONSTRAINT_TYPE = 'PRIMARY KEY' 
                    AND tc.CONSTRAINT_NAME = cu.CONSTRAINT_NAME 
            )
    

    【讨论】:

      猜你喜欢
      • 2014-07-23
      • 1970-01-01
      • 1970-01-01
      • 2016-11-14
      • 2017-10-14
      • 2019-12-10
      • 2014-11-29
      • 2017-01-30
      • 2017-06-09
      相关资源
      最近更新 更多