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

< Сильный > 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. Он хранит данные о столбцах, разрешенных любому пользователю в зависимости от его роли в любой таблице. А Assistance - это таблица, данные столбцов которой мне нужно было отобразить.

Я получаю неверный вывод. Это столбцы, разделенные запятой.

0
Dhwani 28 Май 2013 в 12:50

1 ответ

Лучший ответ

Вы должны использовать динамический 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
2
Nenad Zivkovic 28 Май 2013 в 12:54
Прокомментируйте EXEC и сначала попробуйте PRINT @query, чтобы увидеть, что вы получаете, прежде чем запускать, и настройте соответствующим образом. Я не знаю, что у вас за @cols, возможно, в конце или начале есть запятые, которые нужно удалить
 – 
Nenad Zivkovic
28 Май 2013 в 13:00
Данные выглядят следующим образом: Service_Id, Request_Id, Vat_Tin_No, Bill_Invoice_Date, Created_Date, Entry_Done_By, Modified_Date, Executed_Date Нет ошибок в данных, но по-прежнему возникает та же проблема.
 – 
Dhwani
28 Май 2013 в 13:03
sqlfiddle.com/#!6/d41d8/4366 - Хорошо выглядите в примере, пожалуйста дважды проверьте, не допустили ли вы ошибок, и / или опубликуйте свой точный запрос, чтобы его можно было проверить
 – 
Nenad Zivkovic
28 Май 2013 в 13:14