Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как экранировать кавычки в хранимой процедуре  [new]
misha-x3
Member

Откуда:
Сообщений: 70
Добрый день форумчане!

Подскажите пожалуйста как экранировать одинарные кавычки ( ' ) в хранимой процедуре на MS SQL 2005

вот текст процедуры:
alter PROCEDURE Sl 
  @sTable nVARCHAR(255),
  @sField nVARCHAR(255),
  @sWhere nVARCHAR(255)
as
declare @sql nvarchar(1000)
BEGIN
  set @sql='SELECT '+@sField+' from '+@sTable
  if @sWhere<>'' Set @sql=@sql+' Where '+@sWhere
  exec sp_executesql @sql
END
GO


вызываю ее так:
SelectPoz 'Tovar','*','sN="Комп''ютери"',0,0

выдает ошибку:
Сообщение 207, уровень 16, состояние 1, строка 1
Недопустимое имя столбца "Комп'ютери".

Процедура может и безсмыслена но она мне нужна как пример.

может кто знает как заэкранировать кавычку ( ' )
или может есть другой вариант как сделать такой запрос с кавычкой?
24 дек 12, 17:34    [13678715]     Ответить | Цитировать Сообщить модератору
 Re: Как экранировать кавычки в хранимой процедуре  [new]
_djХомяГ
Guest
select '''кавычка'''  
24 дек 12, 17:36    [13678729]     Ответить | Цитировать Сообщить модератору
 Re: Как экранировать кавычки в хранимой процедуре  [new]
Crimean
Member

Откуда:
Сообщений: 13147
лучше параметры используйте. читайте дальше первого абзаца про sp_executesql
а то "малыш дроппи" в гости придет
24 дек 12, 17:38    [13678745]     Ответить | Цитировать Сообщить модератору
 Re: Как экранировать кавычки в хранимой процедуре  [new]
misha-x3
Member

Откуда:
Сообщений: 70
попробовал через параметры но кажись параметр присваивается только определенному полю, а мне нужно условия отбора задавать для нескольких столбцов, названия которых будут меняться

alter PROCEDURE Sl 
  @sWhere nVARCHAR(255),
  @st int,
  @en int
as
declare @sql nvarchar(1000)
declare @Param nvarchar(1000)
BEGIN
  set @sql='SELECT * from Tovar'
  if @sWhere<>'' Set @sql=@sql+' Where @sW'
  set @Param=N'@sW nVARCHAR(255)'; 
  /*print @sql*/
  execute sp_executesql @sql,@Param,N'@sW=@sWhere'
END
GO 


вызываю

Sl 'sN="HDD"'

ошибка

Сообщение 4145, уровень 15, состояние 1, строка 1
Рядом с "@sW" в контексте, где ожидается условие, указано выражение типа, отличного от логического

Рабочий пример есть у кого? использования параметра как полное условие Where
24 дек 12, 18:59    [13679140]     Ответить | Цитировать Сообщить модератору
 Re: Как экранировать кавычки в хранимой процедуре  [new]
Crimean
Member

Откуда:
Сообщений: 13147
misha-x3,

читайте внимательно, при передаче параметров кавычки уже не нужны
24 дек 12, 19:43    [13679323]     Ответить | Цитировать Сообщить модератору
 Re: Как экранировать кавычки в хранимой процедуре  [new]
misha-x3
Member

Откуда:
Сообщений: 70
Я не совсем все здесь понимаю
потому как процедуру создаю первый раз

alter PROCEDURE Sl 
  @sWhere nVARCHAR(255)
as
declare @sql nvarchar(1000)
declare @Param nvarchar(1000)
declare @Val nvarchar(1000)
BEGIN
  set @sql='SELECT * from Tovar'
  if @sWhere<>'' Set @sql=@sql+' Where sN=@sW'
  set @Param=N'@sW nVARCHAR(255)' 
  set @Val=N'@sW=@sWhere'
  print @sql
  execute sp_executesql @sql,@Param,@Val
END
GO


привызове

Sl 'комп''ютери'

выдает пустую таблицу
что я не так делаю?
24 дек 12, 20:42    [13679498]     Ответить | Цитировать Сообщить модератору
 Re: Как экранировать кавычки в хранимой процедуре  [new]
Crimean
Member

Откуда:
Сообщений: 13147
--  set @Val=N'@sW=@sWhere'
  print @sql
--  execute sp_executesql @sql,@Param,@Val
  execute sp_executesql @sql,@Param,@sW=@sWhere
24 дек 12, 20:48    [13679514]     Ответить | Цитировать Сообщить модератору
 Re: Как экранировать кавычки в хранимой процедуре  [new]
misha-x3
Member

Откуда:
Сообщений: 70
Cпасибо Вам огромное, все получилось
24 дек 12, 20:52    [13679528]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить