Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 带单引号参数的EXEC语句_Sql_Sql Server - Fatal编程技术网

Sql 带单引号参数的EXEC语句

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

我试图执行一个存储过程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
这里的线索是错误消息中的“第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