3

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

SELECT *
FROM dbo.User
WHERE UserID = 2

是否有任何内置功能可以在WHERE不明确定义列名的情况下在子句中使用主键。

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

SELECT *
FROM dbo.User
WHERE PK = 3

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

这可能不存在的原因:

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

4 回答 4

3

不,没有语法。

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

或者您可以使用$rowguid标记为的列ROWGUIDCOL

于 2013-10-11T10:30:10.597 回答
0

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

列名、常量、函数、变量、标量子查询,或由一个或多个运算符或子查询连接的列名、常量和函数的任意组合。该表达式还可以包含 CASE 表达式。

所以你的问题的答案是否定的,它不能是一个索引。

于 2013-10-11T10:10:02.203 回答
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')
于 2013-10-11T10:29:17.290 回答
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

于 2013-10-11T13:18:07.087 回答