我正在尝试执行存储过程usp_find,它接受搜索字符串并显示结果。
它对于简单文本通常工作正常但是当我尝试使用带单引号的参数执行时,它无法执行:
EXECUTE usp_find 'code = ''A'''
我的搜索字符串是code = 'A'
,这里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 ''%'+@LikeSearchstr+'%'''
EXEC(@CMD)
END
答案 0 :(得分:4)
这里的线索是"第4行"在错误消息中。我怀疑错误是在存储过程而不是调用代码。如果您需要帮助修复它,请发布代码。
更重要的是,似乎proc包含动态SQL并且没有参数化。我建议你遵循使用sp_executesql参数化它的最佳实践。另外,请注意前缀' sp _'保留给系统存储过程。
答案 1 :(得分: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
答案 2 :(得分: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'
答案 3 :(得分:-3)
set quoted_identifier off
declare @a varchar(20) = "code = 'a'"