2013-05-28 4 views
0

У меня есть хранимая процедура, в которой я получаю столбец таблицы, который необходим для оператора SELECT в переменной с разделенной запятой. Но это не работает для меня .:SELECT Query with Columns, хранящиеся в переменной

SP:

ALTER PROCEDURE [dbo].[SPGet_Assistance_Detail] 
(
    @Id int, 
    @UserDesig varchar(20) --User Desig can be 'FFR' or 'HO' 
) 
AS 
    DECLARE @Cols VARCHAR(MAX) 
    SELECT @Cols = Column_Listing FROM Role_Col_Mapping WHERE Tbl_Name = 'Assistance' and Role = @UserDesig 
    SELECT @Cols FROM dbo.Assistance WHERE Service_Id=(@Id) 
RETURN 

Здесь Role_Col_Mapping имеет поля, такие как: Tbl_Name, Role и Column_Listing. Он хранит данные cols, разрешенные любому пользователю, основываясь на его роли в любой таблице. И Assistance - это таблица, в которой данные столбцов мне нужно отображать.

Я получаю неправильный выход. Коды разделяются запятой.

ответ

2

Вы должны использовать динамический SQL - что-то вроде этого:

ALTER PROCEDURE [dbo].[SPGet_Assistance_Detail] 
(
    @Id int, 
    @UserDesig varchar(20) --User Desig can be 'FFR' or 'HO' 
) 
AS 
    DECLARE @Cols VARCHAR(MAX) 
    SELECT @Cols = Column_Listing FROM Role_Col_Mapping WHERE Tbl_Name = 'Assistance' and Role = @UserDesig 

    DECLARE @query NVARCHAR(MAX) 
    SELECT @query = 'SELECT ' + @Cols + ' FROM CRM.dbo.Assistance WHERE Service_Id=' + cast(@Id AS VARCHAR(MAX)) 
    EXEC sp_executesql @query 

RETURN 
+0

Комментарий EXEC и попробовать 'PRINT @ query' первый так посмотреть, что вы получаете до выполнения и настройки соответственно. Я не знаю, что такое '@ cols', возможно, в конце или в начале есть запятые, которые нужно удалить. –

+0

Данные выглядят так: * Service_Id, Request_Id, Vat_Tin_No, Bill_Invoice_Date, Created_Date, Entry_Done_By, Modified_Date, Executed_Date * Отсутствие ошибок в данных, но по-прежнему сталкивается с одной и той же проблемой. – Dhwani

+0

http://sqlfiddle.com/#!6/d41d8/4366 - Посмотрите отлично, например, проверьте, были ли вы сделаны какие-либо ошибки и/или отправили свой точный запрос, чтобы его можно было проверить. –