2014-01-15 3 views
1

Возможно ли использовать имя DB в качестве параметра в пользовательской функции?DB name как параметр в пользовательской функции

Например, я пытался использовать конкатенацию, но она не работает таким образом:

create function fn_getEntityOwners (@dbName varchar, @entityId bigint) 
returns table 
as 
return 
select 
    OWNERS.USER_ID 
from 
    @dbName + '.dbo.OWNERS' as OWNERS 
where 
    OWNERS.ENTITY_ID = @entityId 

UPDATE: Я использую SQL сервер

+0

возможный дубликат [Как использовать переменную для имени базы данных в t-sql] (http://stackoverflow.com/questions/727788/how-to-use-variable-for-database-name-in-t-sql) –

+0

@AndriyM. Мой вопрос более конкретный, потому что мне нужно использовать имя БД в качестве параметра в пользовательской функции, а функция накладывает некоторые ограничения. – ako

+1

Ну, вы просто не можете параметризовать * имя * (имя базы данных, имя столбца, имя таблицы). Почти все ответы (как здесь, так и здесь) предлагают использовать динамический SQL. Вы не можете использовать динамический SQL в функции, что означает, что вы не получаете нигде с * этим конкретным вопросом *. Я бы предложил вам задать новый вопрос, где вам может понадобиться немного рассказать о том, что вы пытаетесь сделать, и где вы конкретно спросите об альтернативах использованию динамического SQL (или, возможно, альтернатив использованию функции?). , –

ответ

1

Вам необходимо использовать динамический SQL, чтобы сделать это. Что такое БД? Here's другой SO вопрос, который относится

+1

Я использую сервер sql – ako

+0

Отличный, SQL Server будет поддерживать динамический SQL. – tfandango

+0

См. Мой комментарий к @DominionDave – ako

3

Поместите свой код в функции в виде строки и выполнить с помощью динамического SQL

DECLARE @SQL varchar(2000) 

SELECT @SQL = 

'select 
    OWNERS.USER_ID 
from 
    ' + @dbName + '.dbo.OWNERS as OWNERS 
where 
    OWNERS.ENTITY_ID = ' + @entityId 


EXEC(@SQL) 
+0

Не нравится этот подход, потому что запрос становится строкой и не проверяется SQL Server Management Studio. Но в любом случае спасибо за ваше решение. Другие идеи? – ako

+0

Вы беспокоитесь о том, что база данных не существует и выдает ошибку? если так всегда можно добавить код, чтобы проверить, существует ли до запроса для user_id ... IF db_id (@dbName) НЕ НАЧИНА НАЧАТЬ ... – DominionDave

+0

Нет, меня беспокоит ситуация, когда вы ошибаетесь в sql-запросе, это просто строка, которую вы узнаете только после выполнения функции. Я показал простой пример, но представьте, что функция запроса внутри является большой и сложной. – ako

0

Вы также можете использовать sqlcmd режим для этого (включить это в меню «Запрос» в управлении Студия).

:setvar dbname "TEST.dbo.OWNERS" 

select 
    OWNERS.USER_ID 
from 
    $(dbname) as OWNERS 
where 
    OWNERS.ENTITY_ID = @entityId 


... это решение принес вам Stack Overflow ...


WhatUp @DominionDave - Приятно видеть вас на SO плайя :-D

+0

Не работает внутри функции. – ako

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