SQL Server 2005 - введите имя таблицы для запроса через параметр - PullRequest
1 голос
/ 16 июля 2009

Вот ситуация. Из-за структуры базы данных, с которой мне приходится работать, мне нужно написать хранимую процедуру таким образом, чтобы я мог передать имя таблицы , к которому нужно обращаться, если это вообще возможно. Рассматриваемая программа выполняет свою обработку заданиями, и каждое задание получает свою собственную таблицу, созданную в базе данных, IE table-jobid1, table-jobid2, table-jobid3 и т. Д. К сожалению, я ничего не могу с этим поделать - я Я застрял с этим.

Однако теперь мне нужно провести анализ данных с этими индивидуализированными таблицами. Я хотел бы избежать использования SQL в файлах кода любой ценой, если это возможно. В идеале я хотел бы иметь хранимую процедуру, похожую на:

SELECT *
FROM @TableName AS tbl
WHERE @Filter

Возможно ли это даже в SQL Server 2005? Любая помощь или предложения будут с благодарностью. Если бы это было невозможно, то приветствовались бы и другие способы не допускать SQL-кода.

Спасибо за ваше время.

Ответы [ 3 ]

4 голосов
/ 16 июля 2009

лучшее решение, которое я могу придумать, - это создать свой sql в хранимом процессе, например:

@ query = 'SELECT * FROM' + @TableName + 'as tbl WHERE' + @ Filter

Exec (@query)

Возможно, не идеальное решение, но оно работает.

1 голос
/ 16 июля 2009

Лучший ответ, который я могу придумать, - это создать представление, объединяющее все таблицы вместе со столбцом id в представлении, сообщающем, откуда поступили данные из представления. Затем вы можете просто передать этот идентификатор в сохраненный процесс, который будет идти против представления. Это предполагает, что таблицы, которые вы просматриваете, имеют одинаковую схему.

пример:

create view test1 as

select * , 'tbl1' as src
 from job-1
union all
select * , 'tbl2' as src
 from job-2
 union all
 select * , 'tbl3' as src
 from job-3

Теперь вы можете выбрать * из test1, где src = 'tbl3', и вы будете получать записи только из таблицы job-3

0 голосов
/ 16 июля 2009

Это был бы бессмысленный хранимый процесс. Выбрать из какой-то таблицы, используя некоторые параметры? По сути, вы снова определяете весь запрос во всем, что используете для вызова этого процесса, так что вы можете также сгенерировать sql самостоятельно.

единственная причина, по которой я бы сделал динамический процесс записи в SQL, - это если вы хотите сделать что-то, что вы можете изменить без повторного развертывания вашей базы кода. Но в этом случае вы просто выбираете *. Вы не можете определять столбцы, предложение where или порядок по-разному, так как вы пытаетесь использовать его для нескольких таблиц, поэтому нет никаких значимых изменений, которые вы могли бы внести в него.

Короче говоря: это даже не стоит делать. Просто вставьте в таблицу специфические sprocs или запишите свой sql в виде строк (но убедитесь, что он параметризован) в вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...