2016-12-20 4 views
0

Я создаю запрос, который выберет все данные в таблице. Запрос будет выбирать базу таблицы для переменной, которую я передам хранимой процедуре.Как использовать переменную в предложении FROM в запросе SQL Server?

Здесь, в моем примере. Если я выполню example_sp table1, он выберет в table1. То же самое, если я использую example_table table2, он должен выбрать table2.

ALTER PROCEDURE example_sp 
    @type varchar(10), -- value will be `table1` or `table2` 
AS 
BEGIN 
    SELECT * FROM @type 
END 
+1

Если вы собираетесь передать имя таблицы, как это, вы должны использовать тип данных sysname вместо varchar (10). И следуйте примеру, который Gordon опубликовал ниже, убедившись, что вы используете QUOTENAME, как он это сделал в его прекрасном примере. Это значительно поможет снизить риск внедрения sql. –

ответ

2

Вам нужно динамический SQL, чтобы передать идентификаторы, такие как имена таблиц и имена столбцов:

ALTER PROCEDURE example_sp (
    @tablename varchar(10) -- value will be `table1` or `table2` 
) 
AS 
BEGIN 
    DECLARE @sql NVARCHAR(MAX); 

    SET @sql = 'SELECT t.* FROM @tablename t'; 

    SET @sql = REPLACE(@sql, '@tablename', QUOTENAME(@tablename)); 

    EXEC sp_executesql @sql; 
END; 
+1

Почему бы не написать имя таблицы в одном выражении вместо двух? –

+1

Просто любопытно ... зачем заменить, а не просто concat? –

+2

execute example_sp ('' '; DROP TABLE STUDENTS;') – Stavr00

0

Ваш SP должен будет вернуть 2 результирующие наборы, один из которых пусто. Просто поместите обе SELECT заявления, в том числе WHERE @type = 'table1'

Это даже лучше, если результат устанавливает матч, в этом случае вы можете просто объединить их с UNION

2

немного другая версия того, что предложил Гордон .....

ALTER PROCEDURE example_sp 
    @TableName SYSNAME --<-- Use appropriate data type for sql server objects 
AS 
BEGIN 
    SET NOCOUNT ON; 

    Declare @Sql NVARCHAR(MAX); 

    SET @Sql = N' SELECT * FROM ' + QUOTENAME(@TableName) 

    Exec sp_executesql @Sql 
END 
Смежные вопросы