2015-07-16 2 views
-2

Я хочу выполнить запрос sql, используя динамическое имя таблицы.динамическое имя таблицы, которое должно быть передано в sql-запросе

Я пробовал коды ниже, но ни один из них не работает для меня и не вызывает синтаксическую ошибку.

exec sp_executesql N'SELECT * FROM @Table1 D WITH (NOLOCK)', 
    N'@Table1 nvarchar(40)',@Table1=N'master.dbo.ABCD_data' 

ИЛИ

exec sp_executesql N'SELECT * FROM [email protected]+_data D WITH (NOLOCK)', 
    N'@Variable1 nvarchar(4),',@Variable1=N'ABCD' 

Может кто-нибудь помочь мне в создании этого динамического имени таблицы?

Получаю этот запрос из sql-профилировщика. Фактически я выполняю его в коде C# и получил это в профилировщике.

Мой C# код очень прост, его вид этого:

string query = @"SELECT * FROM [email protected]+_data D WITH (NOLOCK)"; 
SqlCommand cmd = new SqlCommand(); 
cmd.CommandText = query; 
cmd.CommandType = CommandType.Text; 
cmd.Parameters.AddWithValue("@Variable1", "ABCD"); 
DataTable dt = new DataTable(); 
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd)) 
{ 
    adapter.Fill(dt); 
} 
+0

Я попробовал этот путь уже, но это не помогло мне –

+0

Может быть, вы могли бы разместить код C#, который ведет к этому запросу – Andomar

+0

я добавил, что в настоящее время. Вы можете увидеть обновленный код выше. –

ответ

-1

Вы не можете передавать имена таблиц или столбцов в качестве параметров.

Обычный способ вокруг, что называется «динамический SQL»:

declare @sql nvarchar(max); 
set @sql = 'select * from ' + quotename(@tablename); 
exec (@sql); 

Или передать оба имени таблицы и значения параметров:

declare @sql nvarchar(max); 
set @sql = 'select * from ' + quotename(@tablename) + ' where col1 = @par1'; 
exec sp_executesql @sql, N'@par1 nvarchar(4)', @par1='val1'; 

наивный способ запустить это из C# (уязвимый для SQL инъекций):

SqlCommand cmd = new SqlCommand(); 
cmd.CommandText = @" 
    declare @sql nvarchar(max); 
    set @sql = 'select * from " + "ABCD" + @"_data d with (nolock)'; 
    exec (@sql); 
    "; 
cmd.CommandType = CommandType.Text; 
DataTable dt = new DataTable(); 
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd)) 
    adapter.Fill(dt); 

чтобы запустить это из C# в то же время, используя quotename Функция:

SqlCommand cmd = new SqlCommand(); 
cmd.CommandText = @" 
    declare @sql nvarchar(max); 
    set @sql = 'select * from ' + quotename(@tablename) + '_data d with (nolock)'; 
    exec (@sql); 
    "; 
cmd.CommandType = CommandType.Text; 
cmd.Parameters.AddWithValue("@tablename", "ABCD"); 
DataTable dt = new DataTable(); 
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd)) 
    adapter.Fill(dt); 
+1

Просто будьте очень осторожны, чтобы вы не вводили уязвимости SQL Injection, опасаясь, как '@ tablename' получает свое значение. – Richard

+3

У вас есть золотой значок в [sql-server], вы считали, что этот вопрос никогда не спрашивался раньше? – Tanner

+0

@Tanner: каждый вариант немного отличается. Этот вопрос включает в себя 'sp_executesql' с параметрами, которые предполагаемый« точный дубликат »не имеет. Предполагаемый дублированный верхний ответ относится к [Sommarskog] (http://www.sommarskog.se/dynamic_sql.html), который является ресурсом для самых продвинутых пользователей SQL Server, явное несоответствие для этого типа вопроса. – Andomar

Смежные вопросы