2015-10-01 10 views
0
alter procedure NewUserTableCreation(@Username varchar(50)) 
as 
    declare @CreateUserTable NVARCHAR(MAX) 
    declare @AddRecord NVARCHAR(MAX) 
    declare @VisitedClothesKids varchar(50)='VisitedClothesKids' 
    declare @InitialCount varchar(20)='0' 
BEGIN 
    --Building query for creating a user table 
    SET @CreateUserTable = 'create table ' + @Username + 
          '_Table(UserActivityData varchar(50),DataValue varchar(20))' 
    EXEC(@CreateUserTable); 

    --Adding Records in the user table 
    SET @AddRecord = 'insert into ' + @Username + '_Table(UserActivityData, DataValue) 
         values(' + @VisitedClothesKids + ',' + @InitialCount + ')' 
    EXEC(@AddRecord); 
END 
GO 

Я выполняю эту процедуру из кода C#. Таблица успешно создана, а затем генерируется исключение говоря,Недопустимое имя столбца «Имя столбца» в SQL Server

Недопустимое окнеИМЯстолбец «VisitedClothesKids»
Неверное имя столбца «InitialCount»

Пожалуйста, помогите! Большое спасибо :)

ответ

0

Чтобы решить эту проблему, вам необходимо просмотреть утверждение, которое вы выполняете. Например, если вы сделали это (переход в «MyData» для имени таблицы):

PRINT @AddRecord; 
EXEC(@AddRecord); 

Вы увидите следующее в качестве вывода:

insert into MyData_Table(UserActivityData,DataValue) values(VisitedClothesKids,0)'

Что не удается, потому что SQL не знаете, что такое «Посещаемость». Вы хотите, чтобы заявление быть

insert into MyData_Table(UserActivityData,DataValue) values('VisitedClothesKids',0)'

с кавычками для обозначения текстовой строки. Чтобы получить это, измените «сборки заявление так:

SET @AddRecord = 'insert into '[email protected]+'_Table(UserActivityData,DataValue) 
values('''[email protected]+''','[email protected]+')' 

В этом контексте SQL будет интерпретировать (или„побег“) две одинарные кавычки, '' как одинарные кавычки, '

+0

Определенно, код имеет как проблемы с дизайном, так и проблемы безопасности. Я обращаюсь только к «почему этот конкретный случай» не удается, с советами о том, как поймать похожие будущие проблемы. –

+0

Спасибо Эндрю и Филиппу. Проблема решена Да, я использую хранимые процедуры для предотвращения SQL-инъекций. Печально, что код по-прежнему уязвим. Ну, это форма моего академического мини-проекта (с крайним сроком, конечно), поэтому я l обеспокоены безопасностью. Я скоро узнаю, как его создать более безопасным способом. В любом случае, еще раз спасибо! –

2

Вопрос заключается в том, что строка, в которой сцеплены сама не ставит значения в кавычки:

values('[email protected]+','[email protected]+')' 

становится

values(VisitedClothesKids,0)' 

, когда вы хотите быть

values('VisitedClothesKids','0')' 

Мы также должны предупредить вас, что метод, который вы используете здесь, открыт для SQL Injection и должен быть avoi Ded.

+0

Спасибо. для подсказки!: D –