2013-10-11 26 views
3

這實際上是一個通用的特別查詢問題。很多時候,我們運行在開發和測試環境即席查詢,喜歡簡單的查詢:在主鍵上匹配時沒有明確命名SQL Server中的鍵

SELECT * 
FROM dbo.User 
WHERE UserID = 2 

是否有任何功能建立一個可以在WHERE子句的主鍵沒有顯式定義列的名稱。

似乎在邏輯上,我認爲,你可以只在一個表上的單一主鍵和SQL Server有這方面的知識,您可以使用類似語法如下:

SELECT * 
FROM dbo.User 
WHERE PK = 3 

PK是一個通用term由SQL Server爲表中存在的當前主鍵提供。

原因,這可能不存在:

  • 怎麼樣的組合鍵,這將不爲他們工作
  • 在生產查詢你不會使用它
  • 這是唯一真正的語法糖
+3

總之一句話:** NO **。如果你想定義一個WHERE條件,你需要指定你想要檢查的列 –

+1

你是對的,沒有內建的東西可以做到這一點。要實現它,你將不得不使用動態SQL,但對於性能/可維護性/安全性的原因,它仍然不是一個好主意。 – Bridge

+2

如果PK是標識列,則可以使用'WHERE IDENTITYCOL = 3'。 –

回答

3

不存在這個沒有語法。如果PK通常是標識列,則可以使用WHERE $identity = 3

或者你可以使用$rowguid爲列標記爲ROWGUIDCOL

+1

'IDENTITYCOL' is [deprecated](http://technet.microsoft.com/en-us/library/ms143729.aspx) - 應該使用'$ identity'。 –

+0

@Damien_The_Unbeliever - 是的。 [我在這裏看到](http://technet.microsoft.com/en-us/library/ms143729.aspx) –

+0

@MartinSmith這正是我所期待的,謝謝。 –

0

Microsoft TechNet,該WHERE條款的表達(這是你問什麼)可以是:

列名稱,常量,函數,變量,標量子查詢或由運算符或運算符或子查詢連接的列名,常量和函數的任意組合。該表達式還可以包含CASE表達式。

所以你的問題的答案是否定的,它不能是一個索引。

0

簡短的回答:NO

朗(不安全)答:是的,使用動態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') 
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