Sql 带单引号参数的EXEC语句
我试图执行一个存储过程usp_find,它接受搜索字符串并显示结果 它通常适用于简单文本,但当我尝试使用带有单引号的参数执行时,它无法执行:Sql 带单引号参数的EXEC语句,sql,sql-server,Sql,Sql Server,我试图执行一个存储过程usp_find,它接受搜索字符串并显示结果 它通常适用于简单文本,但当我尝试使用带有单引号的参数执行时,它无法执行: EXECUTE usp_find 'code = ''A''' 我的搜索字符串是code='A',这里A在单引号中,所以我应用了两个单引号,就像我们通常对引号进行转义一样 我得到一个错误: Msg 102, Level 15, State 1, Line 4 Incorrect syntax near 'A'. 有什么建议吗 CREATE PROC d
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
这里的线索是错误消息中的“第4行”。我怀疑错误在存储过程中,而不是在调用代码中。如果需要修复代码的帮助,请发布代码
更重要的是,proc似乎包含动态SQL,并且没有参数化。我建议您遵循使用sp_executesql参数化它的最佳实践。另外,请注意前缀“sp_389;”是为系统存储过程保留的。避免使用参数串联 试试这个
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
这里根本不需要动态SQL 你可以用
SELECT Name,
OBJECT_DEFINITION(OBJECT_ID) AS Text_Definition
FROM sys.objects
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%' + @LikeSearchstr + '%'
尽管我可能会使用CHARINDEX
,因此当您尝试搜索包含模式语法和sys.sql\u模块中具有特殊意义的字符的字符串时,它可以正常工作
SELECT object_name(object_id) AS Name,
definition
FROM sys.sql_modules
WHERE CHARINDEX(@LikeSearchstr, definition) > 0
sp_是否找到自定义存储过程?如果是,那么。你也可以添加sp_find的代码吗?我认为问题出在procAdd中。过程定义可以通过提供的信息判断它为什么不起作用。你必须在proc中的动态SQL中使用它。可能他们实际上在寻找字符串code='A'
@MartinSmith True,另外,对于这个简单语句来说,动态sql确实是一个过火的问题,我认为,它应该是一个简单的查询,就像您在回答中提到的:)而且sys.sql_modules
在sql 2014中已经被弃用了,我想:)@M.Ali-您在考虑syscomments
?我没有看到任何弃用通知,syscommnets肯定已经消失了,但您也看不到任何关于2014年sys.sql_modules的文档,也许我错了,只是想知道它是否也被弃用。@M.Ali-是的,您错了。2014年是当前版本。以上链接适用于2014年。ops yes cheers谢谢:)适用于:SQL Server(通过当前版本的SQL Server 2008)、Azure SQL数据库。
SELECT Name,
OBJECT_DEFINITION(OBJECT_ID) AS Text_Definition
FROM sys.objects
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%' + @LikeSearchstr + '%'
SELECT object_name(object_id) AS Name,
definition
FROM sys.sql_modules
WHERE CHARINDEX(@LikeSearchstr, definition) > 0