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

Я хочу создать переменную таблицы в хранимой процедуре для вызова данных из 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 ]

0 голосов
/ 02 мая 2018

Вам необходимо создать динамический запрос, поскольку имя таблицы не может быть переменной. В этом случае вы можете использовать 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 
0 голосов
/ 02 мая 2018

Вы можете построить динамический 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 и используемые временные таблицы, или в несколько хранимых процедур.

...