我正在尝试使用该表的主键从数据库中获取数据。问题是每个表的主键名称会有所不同。
例如,用户可能想要提取员工表,主键是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。任何帮助表示赞赏。
答案 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();