вызов хранимой процедуры с апострофом в аргументе не работает

#sql #sql-server #tsql

#sql #sql-сервер #tsql

Вопрос:

У меня есть приложение на C #, когда частью его работы является вставка всех данных из файла Excel в базу данных.

С получением данных из Excel все в порядке, и я использую хранимые процедуры для вставки данных в таблицы в БД.

 SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER Procedure [dbo].[sp_Insert]

@id int,
@brand nvarchar(50),
@model nvarchar(50),
@prodNumber nvarchar(50),
@category nvarchar(50),
@local nvarchar(50)

AS
INSERT INTO Tbl_Registos (ID, Brand, Model, [Product Number], Category, Local)
VALUES (@id, @brand, @model, @prodNumber, @category, @local)
  

Это один из примеров, когда SP работает идеально:

 sp_Insert N'1', N'Brand example', N'ABC123', N'123456-7890', 
          N'Laptop', N'18'
  

Проблема возникает, когда у меня возникают подобные случаи:

 sp_Insert N'1', N'Brand example', N'ABC123', N'123456-7890',
          N'Laptop', N'Director's floor'
  

Когда у меня есть это ' в середине аргумента. Я думал использовать кавычки [], но в случаях, когда у меня есть целые числа, я не могу поместить их между кавычками.

После того, как я получил строку из Excel, я использую цикл для помещения аргументов в строку, которая является запросом.

Комментарии:

1. Я знаю, что у вас уже есть принятый ответ, и это, безусловно, сработает, но мне было бы интересно посмотреть, как вы вызываете SP. Экранирование будет обработано автоматически, если вы используете параметры для объекта SqlCommand. На самом деле вы не хотите брать на себя ответственность за экранирование аргументов там, где это не обязательно.

2. Вам следует избегать именования хранимых процедур с sp_ префиксом — SQL Server будет искать такие процедуры в главной базе данных перед вашей фактической базой данных, поэтому, если MS добавит новую sp_ процедуру позже, ваш вызывающий код будет поврежден.

Ответ №1:

Вы можете избежать ‘в вашем вводе, поместив другой’ перед ним, и вставка будет работать. Вы можете либо сделать это, либо проанализировать данные на наличие подобных символов и игнорировать их. Таким образом, ваш оператор insert с этим экранированным будет:

 sp_Insert N'1', N'Brand example', N'ABC123', N'123456-7890', N'Laptop', N'Director''s floor'