2013-10-11 3 views
3

Это действительно общее задание для специальных запросов. Довольно часто мы проводим специальные запросы в средах разработки и тестирования, простые запросы, как:Соответствие первичному ключу без явного указания ключа в SQL Server

SELECT * 
FROM dbo.User 
WHERE UserID = 2 

Есть ли построить функциональность для использования первичного ключа в пункте WHERE без явного определения имени столбца.

кажется логически мне, что, как вы можете иметь только один первичный ключ на столе и SQL Server имеет знание этого, вы можете использовать синтаксис, как показано ниже:

SELECT * 
FROM dbo.User 
WHERE PK = 3 

Где PK является родовым предоставляемый SQL Server для текущего первичного ключа, который существует в таблице.

Причина, почему это не может существовать:

  • насчет составных ключей, это не будет работать на них
  • Вы бы не использовать его в производственном запросе
  • Это только действительно синтаксис
+3

Одним словом: ** НЕТ **. Если вы хотите определить условие 'WHERE', вам нужно указать столбцы, которые вы хотите проверить, с помощью –

+1

. Вы правы, для этого нет встроенного объекта. Чтобы достичь этого, вам придется использовать динамический SQL, но это все еще не очень хорошо для соображений производительности/ремонтопригодности/безопасности. – Bridge

+2

Вы можете использовать 'WHERE IDENTITYCOL = 3', если PK является столбцом идентификации. –

ответ

3

Нет нет Синтаксис для этого.

Вы можете использовать WHERE $identity = 3, если PK обычно является столбцом идентификации.

Или вы можете использовать $rowguid для столбцов помечается как ROWGUIDCOL

+1

'IDENTITYCOL' [устарел] (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

Короткий ответ: НЕТ

Long (и небезопасным) Ответ: да, используя динамический 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

Можно, конечно, построить свой ИНЕКЕ по отсылая к метамодели базы данных:

-- 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

Смежные вопросы