从表中获取主键

时间:2013-03-13 13:49:25

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

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

例如,用户可能想要提取员工表,主键是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。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

此查询将获得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 
        )

答案 1 :(得分:0)

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

试试这个:

首先,创建一个存储过程,这个存储过程将根据参数创建泛型查询。

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