对于即席查询,这实际上是一个普遍的疑问。我们经常在开发和测试环境中运行即席查询,简单查询如:
SELECT *
FROM dbo.User
WHERE UserID = 2
在没有明确定义列名称的情况下,是否存在在WHERE
子句中使用主键的功能。
从逻辑上讲,对于我来说,由于您只能在表上拥有一个主键且SQL Server知道这一点,因此您可以使用如下语法:
SELECT *
FROM dbo.User
WHERE PK = 3
其中PK
是SQL Server为表中存在的当前主键提供的通用术语。
原因可能不存在:
答案 0 :(得分:3)
没有这方面的语法。
如果PK通常是标识列,则可以使用WHERE $identity = 3
。
或者,您可以将$rowguid
用于标记为ROWGUIDCOL
答案 1 :(得分:0)
根据Microsoft TechNet,WHERE
子句的表达(这是你要问的)可以是:
列名,常量,函数,变量,标量子查询,或由运算符或运算符或子查询连接的列名,常量和函数的任意组合。表达式还可以包含CASE表达式。
所以你的问题的答案是否定的,它不能是一个索引。
答案 2 :(得分:0)
简短回答:否
长(且不安全)回答:是的,使用动态SQL
declare @pk nvarchar(255)
select top 1 @pk = COLUMN_NAME
from information_schema.table_constraints tc
join information_schema.constraint_column_usage ccu ON tc.CONSTRAINT_NAME = ccu.CONSTRAINT_NAME
where tc.CONSTRAINT_TYPE = 'Primary Key' and tc.TABLE_NAME = 'User'
execute('select * from [User] where ' + @pk + ' = 1')
答案 3 :(得分:0)
您当然可以通过引用数据库元模型来构建WHERE子句:
-- get your pk name
declare @myPrimaryKeyName nvarchar(50)
set @myPrimaryKeyName = (SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu ON tc.CONSTRAINT_NAME = ccu.Constraint_name
WHERE tc.CONSTRAINT_TYPE = 'Primary Key' and tc.TABLE_NAME = 'dbo.User')
-- set your pk value
declare @myPrimaryKeyValue int set @myPrimaryKeyValue = 3
-- build your sql query string
declare @sql nvarchar(max) set @sql = 'SELECT * FROM dbo.User WHERE ' + @myPrimaryKeyName + '= ' + @myPrimaryKeyValue
-- execute your query
exec sp_executesql @sql
这只是一个草案。您当然可以将代码插入存储过程中,并将表名和值作为参数。遗憾的是,由于您必须处理@myPrimaryKeyValue