Я хочу сделать таблицу из таблицы. Могу ли я сделать это в Microsoft SQL Server Studio Management Studio?

Я хочу сделать переменную таблицы в хранимой процедуре для вызова данных из 3 различных таблиц, как у меня есть название города в текстовом поле и раскрывающийся список со значениями имен таблиц,

Я уже сделал хранимую процедуру:

[dbo].[sp_Search]
@City nvarchar(50) = null
AS
SELECT * FROM PropertyForSale_TBL  WHERE (City =    @City OR @City IS NULL)

здесь это SP только для текстового поля, а не для выпадающего списка.

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

[dbo].[sp_Search]
@City nvarchar(50) = null,
@Tablename Table (maybe or maybe not i dont know it is not working)

AS
SELECT * FROM @Tablename  WHERE (City = @City OR @City IS NULL)

как я могу это сделать?????

2 ответа

Решение

Вам необходимо создать динамический запрос, поскольку имя таблицы не может быть переменной. Для этого случая вы можете использовать sp_executesql запустить динамический запрос, как показано ниже.

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

create procedure [dbo].[sp_search] 
   @City      nvarchar(50) = null, 
   @Tablename varchar(100) 
as 
  begin 
      declare @sql nvarchar(max)
      set @sql = N'SELECT * FROM ' +  quotename(@Tablename) 
             + '  WHERE (City = @City OR @City IS NULL)' 
      exec sp_executesql 
        @sql, 
        N'@City nvarchar(50)',       
        @City 
  end 

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

Вот краткий пример (обратите внимание, что есть несколько способов выполнения динамического SQL, и у каждого есть свои преимущества и недостатки, проведите небольшое исследование)

DECLARE @City       NVARCHAR(50) = 'New York'
      , @TableName  VARCHAR(100) = 'PropertyForSale_TBL'


DECLARE @SQL NVARCHAR(MAX) = 
    'SELECT * FROM ' + QUOTENAME(@Tablename) + ' WHERE [City] = ''' + @City + ''''

PRINT @SQL -- SELECT * FROM [PropertyForSale_TBL] WHERE [City] = 'New York'

EXEC (@SQL)

Изменить: Также просто заметка динамический код, как правило, не лучшая идея. Вышесказанное открывает себя для внедрения SQL и других головных болей. Посмотрите на структуру вашей базы данных и посмотрите, могут ли данные быть помещены в те же таблицы, операторы IF и используемые временные таблицы, или в несколько хранимых процедур.

Другие вопросы по тегам