Возвращает переменное количество столбцов в SQL Server 2008 - PullRequest
3 голосов
/ 14 ноября 2011

Моя таблица содержит следующие поля, Name,Age,Salary,Phone,DOB. Основываясь на таблице настроек, я должен выбрать только некоторые поля. Например, я говорю в настройках, требуется только Name и Phone. Как я могу сделать это с помощью хранимой процедуры?

РЕДАКТИРОВАТЬ:

Какой из них хорош.

  1. Выберите обязательные поля из таблицы.
  2. Выберите все столбцы и на странице ASP.NET используйте свойство .Visibility, чтобы скрыть или отобразить столбцы

Ответы [ 4 ]

2 голосов
/ 14 ноября 2011

SQL является фиксированным языком столбцов: столбцы нельзя добавлять или удалять «на лету»

Вам потребуется использовать динамический SQL для построения оператора SELECT или использовать операторы IF для выполнения других. Однако вы открываете проблемы с кэшированием, безопасностью и внедрением.

Лично я бы игнорировал столбцы в клиентском коде и имел бы простой, эффективный SQL-запрос. Контракт или API между SQL Server и клиентом должны быть статичными и предсказуемыми. Если таблица параметров применяется в SQL Server, ваш клиент не знает, какие столбцы ожидать. Если ваш клиент знает, он может их игнорировать.

После редактирования, вариант 2, вид.

Но данные должны быть удалены до того, как будет отображено на странице.

Держите это просто : пока не пытайтесь что-то оптимизировать пока

2 голосов
/ 14 ноября 2011

Вам потребуется несколько разных вариантов выбора - в зависимости от таблицы настроек - в вашем сохраненном процессе, чтобы вернуть разные наборы данных.

 CREATE PROCEDURE dbo.YourProcedure(...)
 AS BEGIN
   DECLARE @Setting INT  -- ?? whatever it is 

   SELECT @Setting = Choice FROM dbo.YourSettingsTable WHERE ....... ???

   IF @Setting = 1
      SELECT Name, Phone
      FROM dbo.YourDataTable

   ELSE
      SELECT Name, Age, DOB, Phone, Salary  
      FROM dbo.YourDataTable

 END

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

С другой стороны - может быть проще определить этот параметр перед вызовом вашего сохраненного процесса - а затем просто передать этот параметр в качестве параметра сохраненного процесса.

Или, что еще лучше: иметь отдельные сохраненные процедуры для каждого «сценария», а затем вызывать соответствующий хранимый процесс в зависимости от значения вашего параметра ....

1 голос
/ 14 ноября 2011

Создайте SQL-файл, который вы хотите динамически, затем выполните его с помощью exec.

    declare @sql varchar(500)
    set @sql = 'select 123'
    exec (@sql)

Приведенный выше код должен помочь вам понять, что вам нужно знать.

0 голосов
/ 14 ноября 2011
  1. Иметь хранимую процедуру для каждого набора полей, которые вы хотите выбрать
  2. Разрешить передачу списка имен полей в качестве параметра
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...