2016-01-08 2 views
-1

Я получаю ошибку. пожалуйста, suggeestt, где я ошибаюсь. я даюОшибка: Msg 207, уровень 16, состояние 1, строка 4 Недопустимое имя столбца 'france'

форматирования
--Table 
Alter TABLE [dbo].[store_2](enter code here 
    [id] [int] NULL, 
    [name] [varchar](100) NULL, 
    [Email] [varchar](100) NULL, 
    [sub] [varchar](100) NULL 
) ON [PRIMARY] 

-- 

Alter TABLE [dbo].[store_1](
    [id] [int] NULL, 
    [name] [varchar](100) NULL, 
    [Email] [varchar](100) NULL 
) ON [PRIMARY] 

--Proc 

alter proc sele_2 
(
@da nvarchar(100), @SR nVARCHAR(100) ,@sub nvarchar(50) 
) as begin 

Declare @SqlStr nvarchar(max) 

Creat0e Table #ComplianceTem 
(name varchar(100), email varchar(100) 
) 

set @SqlStr = N'Insert into #ComplianceTem (name,email) 
select name,Email from '[email protected]+' 
union 
select name,Email from store_2 s where 1=1 and s.sub= '+ CAST(@sub AS nVARCHAR(50)) 
print @sqlstr 
execute sp_executesql @SQLstr 

select *from #ComplianceTem 
end 


exec sele_2 arvind,store_1, france 

я получаю сообщение об ошибке. пожалуйста, помогите мне, где я ошибаюсь

Msg 207, Level 16, State 1, Line 4

Invalid column name 'france'.

ответ

1

Если вы используете параметры, у вас не будет этой проблемы. Проблема заключается в отсутствии одинарных кавычек. Вы можете добавить их, но правильное решение:

set @SqlStr = N'Insert into #ComplianceTem (name,email) 
select name, Email from '[email protected]+' 
union 
select name, Email from store_2 s where 1=1 and s.sub = @sub 
'; 

print @sqlstr 
execute sp_executesql @SQLstr, N'@sub nvarchar(50)', @sub = @sub; 

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

EDIT:

Если вы строите строку SQL, то я бы рекомендовал replace() подход:

set @SqlStr = N'Insert into #ComplianceTem (name,email) 
select name, Email from @SR 
union 
select name, Email from store_2 s where 1=1 and s.sub = ''@sub'' 
'; 

set @SqlStr = replace(@SqlStr, '@SR', @SR); 
set @SqlStr = replace(@SqlStr, '@sub', @sub); 

. . . 

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

set @SqlStr = replace(@SqlStr, '@SR', quotename(@SR)); 

Однако, вы не хотите, чтобы сделать это для @sub, потому что она меняет смысл запроса.

+0

Большое спасибо sir ... Это работает .. @ Gordon Linoff – Arvind

+0

Спасибо большое, сэр ... Он работает .. @GordonLinoff – Arvind