匹配主键而不显式命名SQL Server中的键

时间:2013-10-11 10:05:10

标签: sql-server tsql

对于即席查询,这实际上是一个普遍的疑问。我们经常在开发和测试环境中运行即席查询,简单查询如:

SELECT *
FROM dbo.User
WHERE UserID = 2

在没有明确定义列名称的情况下,是否存在在WHERE子句中使用主键的功能。

从逻辑上讲,对于我来说,由于您只能在表上拥有一个主键且SQL Server知道这一点,因此您可以使用如下语法:

SELECT *
FROM dbo.User
WHERE PK = 3

其中PK是SQL Server为表中存在的当前主键提供的通用术语。

原因可能不存在:

  • 复合键怎么样,这对他们不起作用
  • 您不会在生产查询中使用它
  • 这只是真正的语法糖

4 个答案:

答案 0 :(得分:3)

没有这方面的语法。

如果PK通常是标识列,则可以使用WHERE $identity = 3

或者,您可以将$rowguid用于标记为ROWGUIDCOL

的列

答案 1 :(得分:0)

根据Microsoft TechNetWHERE子句的表达(这是你要问的)可以是:

  

列名,常量,函数,变量,标量子查询,或由运算符或运算符或子查询连接的列名,常量和函数的任意组合。表达式还可以包含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

的多种数据类型,因此可能会变得非常复杂