Вам не нужно использовать quotename
для данных - как следует из названия функции, ее следует использовать с именами (идентификаторы A.K.A).
Кроме того, когда вы используете quotename
, он добавляет [
и ]
к полученному значению, поэтому нет смысла добавлять их снова (['+quotename(@campus)+']
в вашем коде).
Я бы порекомендовал три улучшения для вашей процедуры:
- Измените тип данных
@campus
на sysname
- это специальный синоним типа данных на nvarchar(128) not null
, используемый SQL Server для всех идентификаторов.
- белый список имен схем.
Это критическое изменение для защиты от атак SQL-инъекций.
Все, что не может быть параметризовано, должно быть занесено в белый список.
- используйте
sp_ExecuteSql
вместо EXEC
Это приведет к лучшей хранимой процедуре, поскольку устраняет угрозу SQL-инъекция :
CREATE PROCEDURE AddStudent_proc(
@campus sysname,
@StudentID numeric(4,0),
@Name varchar(50),
@Surname varchar(50),
@ID_numeric numeric(13,0),
@Address varchar(100)
)
AS
BEGIN
IF EXISTS(
SELECT 1
FROM Sys.Schemas
WHERE name = @campus
)
BEGIN
DECLARE @dynamic nvarchar(4000),
@paramDefinition nvarchar(4000)
SELECT @dynamic = N'INSERT INTO '+ quotename(@campus) + N'.Student_tbl (
StudentID,
Name,
Surname,
ID_numeric,
Address
)
VALUES(@StudentID, @Name, @Surname, @ID_numeric, @Address)',
@paramDefinition =
N'@StudentID numeric(4,0),
@Name varchar(50),
@Surname varchar(50),
@ID_numeric numeric(13,0),
@Address varchar(100)'
EXEC sp_executeSql @dynamic, @paramDefinition, @StudentID, @Name, @Surname, @ID_numeric, @Address;
END
END
GO