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