2015-04-06 6 views
-1

Я пытаюсь выполнить хранимую процедуру usp_find, которая принимает строку поиска и показывает результаты.Заявление EXEC с параметрами с одинарными кавычками

Он отлично работает нормально для простых текстов, но когда я пытаюсь выполнить с параметром, имеющий одинарные кавычки, он не в состоянии выполнить:

EXECUTE usp_find 'code = ''A''' 

Моя строка поиска code = 'A', Здесь А в одинарные кавычки поэтому я применил две одинарные кавычки, как мы обычно делаем для цитаты, чтобы убежать.

Я получаю сообщение об ошибке:

Msg 102, Level 15, State 1, Line 4 
Incorrect syntax near 'A'. 

Любые предложения?

CREATE PROC dbo.usp_find(@LikeSearchstr VARCHAR(255)) 
    AS 

    BEGIN 
    DECLARE @cmd VARCHAR(MAX) 

    SET @cmd=' 
    SELECT Name,OBJECT_DEFINITION(OBJECT_ID) as Text_Definition 
    FROM sys.objects 
    WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE ''%'[email protected]+'%''' 

    EXEC(@CMD) 
    END 
+1

Является sp_find обычной хранимой процедурой? Если да, то [** не используйте префикс 'sp' для пользовательского SP **] (https://msdn.microsoft.com/en-us/library/dd172115 (v = vs.100) .aspx). –

+0

можете ли вы добавить код sp_find? – ughai

+2

Я думаю, что проблема заключается в том, что proc –

ответ

2

Там вообще нет необходимости в динамическом SQL.

Вы можете просто использовать

SELECT Name, 
     OBJECT_DEFINITION(OBJECT_ID) AS Text_Definition 
FROM sys.objects 
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%' + @LikeSearchstr + '%' 

Хотя я бы, вероятно, использовать CHARINDEX так он работает правильно, когда вы пытаетесь искать строки, содержащие символы особого значения в синтаксисе шаблона и sys.sql_modules.

SELECT object_name(object_id) AS Name, 
     definition 
FROM sys.sql_modules 
WHERE CHARINDEX(@LikeSearchstr, definition) > 0 
+0

Также 'sys.sql_modules' устарел в SQL 2014, я думаю :) –

+0

@ M.Ali - Вы думаете о' syscomments'? Я не вижу уведомления об отказе https://msdn.microsoft.com/en-us/library/ms175081.aspx –

+0

syscommnets определенно ушел, но вы не видите никакой документации по 'sys.sql_modules' за 2014 год, возможно, я ошибаюсь, просто интересно, было ли оно также устаревшим. –

-3
set quoted_identifier off 
declare @a varchar(20) = "code = 'a'" 
4

Ключом здесь является "Линия 4" в сообщении об ошибке. Я подозреваю, что ошибка находится в хранимой процедуре, а не в вызывающем коде. Отправьте код, если вам нужна помощь в его исправлении.

Что еще более важно, кажется, что proc содержит динамический SQL и не параметризован. Я предлагаю вам следовать наилучшей практике параметризации с помощью sp_executesql. Кроме того, помните, что префикс «sp_» зарезервирован для системных хранимых процедур.

+0

Вы правы. Благодаря! –

1

Избегайте использования параметра конкатенации

Попробуйте это ...

CREATE PROC dbo.usp_find --<-- sp_ prefix not a good practice 
@LikeSearchstr VARCHAR(255) 
    AS 
BEGIN 
    SET NOCOUNT ON; 
    DECLARE @cmd NVARCHAR(MAX) --<-- nVarChar data type here 

SET @cmd= N' SELECT Name,OBJECT_DEFINITION(OBJECT_ID) as Text_Definition 
      FROM sys.objects 
      WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE ''%'' + @LikeSearchstr + ''%'' ' 

Exec sp_executesql @cmd 
        ,N'@LikeSearchstr VARCHAR(255) ' 
        ,@LikeSearchstr 
END 

Теперь, когда вы выполняете этот Proc только передать строку, которую вы ищете, как ...

Exec dbo.usp_find 'A' 
+0

Предположительно, они на самом деле ищут строку 'code = 'A'' –

+1

@MartinSmith True, также динамический sql для этого простого утверждения действительно является излишним, я думаю, это должен быть простой запрос, как вы упомянули в своем ответе:) –

+0

It Works. Благодаря! –

Смежные вопросы