MS SQL Wybór kolumny w procedurze na podstawie przekazanego parametru.

0

Cześć,
piszę procedurę do GridView zwracającą jedynie zawartość danej strony.
Szukam najlepszego sposobu, aby wyciągnąć dane konkretnej kolumny z tabeli na podstawie przekazanego argumentu.
W jaki sposób (aby to miało ręce i nogi a przede wszystkim było bezpieczne) przekazać do procedury część nazwy tabeli w argumencie?

Już tłumaczę o co chodzi..
Mam w bazie tabelę dt_Mode a w niej kilkanaście kolumn o nazwie Mode_[+skrót języka], np. Mode_PL, Mode_DE, Mode_EN itd.

Chciałbym na podstawie argumentu przekazywanego do procedury pobrać wartość z odpowiedniej kolumny, np. przekazuję 'PL' otrzymuję dane z kolumny Mode_PL, przekazuję 'EN' otrzymuję dane z kolumny Mode_EN,
Tak wygląda procedura:

CREATE PROCEDURE GetItemPageWise
	  @PageIndex INT = 1
      ,@PageSize INT = 10
      ,@RecordCount INT OUTPUT
	  ,@LangID varchar (3)
AS
BEGIN
	Declare @ModeColumn varchar(20)

      SET NOCOUNT ON;
	  Set @ModeColumn = 'dt_Mode.Mode_' + @LangID


      SELECT ROW_NUMBER() OVER
      (
            ORDER BY [ItemID] ASC
      )
      AS RowNumber
      ,[ItemID]
      ,[Date]
      ,[OwnerID]
	  ,[Item].[ModeID]
	  ,[dt_Mode].[Mode_PL] <- tutaj chciałbym wstawić zmienną @ModeColumn
     INTO #Results
      FROM [Item]
	  INNER JOIN dt_Mode ON Item.ModeID = dt_Mode.ModeID
	  WHERE [ItemID] > 350000
     
      SELECT @RecordCount = COUNT(*)
      FROM #Results
           
      SELECT * FROM #Results
      WHERE RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1
     
      DROP TABLE #Results
END
GO

Próbowałem zapisać cały zapytanie w zmiennej, np. DECLARE @sql nvarchar(max) = 'SELECT ... ' + @ModeColumn + '...' ale chyba nie tędy droga.

Przykładowe wywołanie jakie chciałbym uzyskać:

DECLARE @RecordCount int
EXECUTE GetItemPageWise 3, 10, @RecordCount out, 'PL'
SELECT @RecordCount

Pozdrawiam

Edit:

CREATE PROCEDURE GetItemPageWise
	  @PageIndex INT = 1
      ,@PageSize INT = 10
      ,@RecordCount INT OUTPUT
	  ,@LangID varchar (3)
AS
BEGIN
	Declare @ModeColumn varchar(20)

      SET NOCOUNT ON;
	  Set @ModeColumn = 'dt_Mode.Mode_' + @LangID


      SELECT ROW_NUMBER() OVER
      (
            ORDER BY [ItemID] ASC
      )AS RowNumber
      ,[ItemID]
      ,[Date]
      ,[OwnerID]
	  ,[Item].[ModeID]
	  ,
	  CASE @LangID
    WHEN 'PL' THEN [dt_Mode].[Mode_PL]
    WHEN 'EN' THEN [dt_Mode].[Mode_EN]
                ELSE NULL
  END as selectedColumn
     INTO #Results
      FROM [Item]
	  INNER JOIN dt_Mode ON Item.ModeID = dt_Mode.ModeID
	  WHERE [ItemID] > 350000
     
      SELECT @RecordCount = COUNT(*)
      FROM #Results
           
      SELECT * FROM #Results
      WHERE RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1
     
      DROP TABLE #Results
END
GO

Czy takie rozwiązanie jest ok?

0

@UglyMan: ostatnie moje rozwiązanie działa:

CASE @LangID
    WHEN 'PL' THEN [dt_Mode].[Mode_PL]
    WHEN 'EN' THEN [dt_Mode].[Mode_EN]
                ELSE NULL
  END as selectedColumn

Przysiądę dziś do dynamicznego SQLa, dzięki!

1 użytkowników online, w tym zalogowanych: 0, gości: 1