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?