Как выбрать имена таблиц и столбцов из переданных параметров в SQL Server? - PullRequest
3 голосов
/ 10 февраля 2012

У меня есть две очень похожие таблицы в нашей базе данных, и мне нужно написать хранимую процедуру для моего веб-приложения Visual Studio 2010 для чтения данных из одной из этих таблиц по номеру таблицы.у нас есть только две таблицы на выбор, но я вижу, что этот проект растет с ростом проекта.

Это то, что я пытаюсь сделать, но этот код неверен:

PROCEDURE [dbo].[spGetData]
  @tableID int
AS
BEGIN
SET NOCOUNT ON;
    declare @col1 nvarchar(50), @table nvarchar(50)
    set @col1=case when @tableID=1 then 'SMRequestID' else 'WHRequestID' end
    set @table=case when @tableID=1 then 'SMRequest' else 'WHRequest' end

    select @col1 as 'Request', WorkOrder, PartNumber, Qty, EmployeeID
    from @table
END

Как правило, ColumnName и TableName зависят от параметра @tableID, который будет передан.

Как мне поступить?

Примечание:Мои поиски ничего не связывают, но я разработчик на C #, а не разработчик базы данных.Я предполагаю, что об этом уже спрашивали, просто я не использую правильные ключевые слова.

Ответы [ 3 ]

3 голосов
/ 10 февраля 2012

Хотя я думаю, что Марк вполне корректен, учитывая небольшое количество таблиц и простоту ваших запросов, вот динамический пример sql, который передает имена таблиц и столбцов:следующим образом:

exec spGetData 'SMRequest', 'SMRequestID'
exec spGetData 'WHRequest', 'WHRequestID'
2 голосов
/ 10 февраля 2012

Одним из вариантов будет использование условного выражения на основе идентификатора и размещение кода для конкретной таблицы в каждом разделе таблицы.

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

ПРИМЕЧАНИЕ: серверы баз данных в целом плохо работают со строками (создают динамические sql).

РЕДАКТИРОВАТЬ1: ПРИМЕР

ДЛЯ ИНСТАНЦИИ: ЭТОТ SQL

declare @mytest varchar(5)
set @mytest = 'PROCS'

IF @mytest = 'PROCS'
BEGIN /* STORED PROCS */
  SELECT DISTINCT 
    o.name AS ObjectName_StoredProcedure
  FROM sysobjects as o 
  WHERE o.xtype = 'P'
END
ELSE
IF @mytest = 'DEFAULT'
BEGIN
   SELECT DISTINCT 
    o.name AS ObjectName_StoredProcedure
  FROM sysobjects as o 
  WHERE o.xtype = 'D'
END

дает вам имена процедур хранилища или ограничения по умолчанию в зависимости от того, что вы передаете параметру.

РЕДАКТИРОВАТЬ 2: На основе кода операции:

CREATE PROCEDURE [dbo].[spGetData]   
  (@tableID int  )
   AS 
  BEGIN
     SET NOCOUNT ON;
     IF @tableID = 1
     BEGIN
       SELECT SMSRequestId AS 'Request',
          WorkOrder, PartNumber, Qty, EmployeeID 
       FROM SMRequest
     END   
     IF @tableID = 2
     BEGIN
       SELECT WHRequestID AS 'Request',
          WorkOrder, PartNumber, Qty, EmployeeID 
       FROM WHRequest
    END
 END
1 голос
/ 10 февраля 2012

Сделайте это с динамическим SQL:

PROCEDURE [dbo].[spGetData]
  @tableID int
AS
BEGIN
SET NOCOUNT ON;
    declare @col1 nvarchar(50), @table nvarchar(50),  @cmd nvarchar(400)
    set @col1=case when @tableID=1 then 'SMRequestID' else 'WHRequestID' end
    set @table=case when @tableID=1 then 'SMRequest' else 'WHRequest' end


    @cmd = "select " + @col1 + " as 'Request', WorkOrder, PartNumber, Qty, EmployeeID from " + @table

   EXEC(@cmd)

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