SQL динамический оператор SELECT из значений, хранящихся в таблице - PullRequest
3 голосов
/ 06 марта 2011

Я изучал это пару дней и чувствую, что хожу кругами. У меня есть базовые знания SQL, но есть много областей, которые я не понимаю.

У меня есть таблица, в которой хранятся имена и поля всех других таблиц в моей базе данных.

tblFields
===================================================

TableName      FieldName     BookmarkName  
---------------------------------------------------
Customer       FirstName     CustomerFirstName  
Customer       LastName      CustomerLastName  
Customer       DOB           CustomerDOB  

Я хочу написать SELECT заявление, подобное следующему, но я не могу заставить его работать:

SELECT (SELECT [FieldName] FROM [TableName]) FROM tblFields

Возможно ли это? Приложение, которое я разработал, требует этого для пользовательской настройки отчетов.

Ответы [ 2 ]

1 голос
/ 06 марта 2011

Если я понимаю, что вы пытаетесь сделать, я думаю, это поможет вам.Это не красиво и работает для SQL Server 2005 и выше, но, возможно, это то, что вы ищете:

declare @tableName nvarchar(100)
declare @sqlQuery nvarchar(max)
declare @fields varchar(500)
set @tableName = 'YourTableName'
set @fields = ''
select @fields = @fields + QUOTENAME(t.fieldname) + ',' from (
select distinct fieldname from tblfields where tablename = @tableName)t


set @sqlQuery = 'select ' + left(@fields, LEN(@fields)-1) + ' from ' + QUOTENAME(@tableName)

execute sp_executesql @sqlQuery

Редактировать: Как предложил Мартин, я отредактировал так, чтобы столбцы и имя таблицы использовали QUOTENAME

1 голос
/ 06 марта 2011

Если я правильно понимаю, что вы пытаетесь сделать, вам, вероятно, лучше сделать это как два отдельных запроса из вашей программы.Тот, который получает поля, которые вы хотите выбрать, которые вы затем используете в своей программе для создания второго запроса, который фактически получает данные.

Если это должно быть сделано полностью в SQL, то вам нужно будет сообщить намкакую базу данных вы используете.Если это SQL Server, вы можете использовать курсор над первым запросом для создания второго запроса, который затем выполняется с помощью хранимой процедуры sp_executesql.Но рекомендуется делать это вне SQL.

...