在@variable处传递多个引号,只要有单引号

时间:2017-03-09 08:39:50

标签: sql sql-server

以下是我的程序。它工作正常。

Create PROCEDURE [dbo].[spCompanyName]              
(              
  @CompanyName VARCHAR(100))
  AS
  Begin

  DECLARE @sql VARCHAR(MAX) 
  SET @sql =  ' Select EmpID,CompanyName FROM Employee' + CHAR(13) + CHAR(10)  

  IF len(@CompanyName) > 0               
    BEGIN              
        SET @sql = @sql + ' Where (RTRIM(LTRIM(CompanyName)) like ''' + @CompanyName + '%'') ' + char(13) + char(10)      
    END 

    PRINT @SQL  
    EXEC(@sql)  
End

exec spCompanyName @CompanyName='So Unique, formerly Sofia''''s'

我需要在公司名称中有单引号的地方,如果我在单引号中传递8个引号,我需要output.above程序,我需要在哪里更改。

例如:

exec spCompanyName @CompanyName='So Unique, formerly Sofia''''''''s'

exec spCompanyName @CompanyName='Absolute''''''''s,Strategy''''''''s'

2 个答案:

答案 0 :(得分:0)

不要以为“我会抛弃使用参数将数据代码分开并开始手动尝试保护字符串的所有有用功能” - 保持使用参数。

而不是

EXEC(@sql)

有:

EXEC sp_executesql @sql,N'@CompanyName varchar(100)',@CompanyName = @CompanyName

并改变:

SET @sql = @sql + ' Where (RTRIM(LTRIM(CompanyName)) like ''' + @CompanyName + '%'') ' + char(13) + char(10) 

为:

SET @sql = @sql + ' Where (RTRIM(LTRIM(CompanyName)) like @CompanyName + ''%'') ' + char(13) + char(10) 

或者,或者,考虑只编写一个普通查询,而不是动态SQL:

Create PROCEDURE [dbo].[spCompanyName]              
(              
  @CompanyName VARCHAR(100))
WITH RECOMPILE
  AS
  Begin

  Select EmpID,CompanyName FROM Employee
  Where RTRIM(LTRIM(CompanyName)) like @CompanyName + '%' or
        @CompanyName is null
End

假设您正在使用SQL Server 2008(具有特定补丁级别)或更高版本,正如Erland Sommarskog的Dynamic Search Conditions in T-SQL

中所指定的那样

答案 1 :(得分:0)

如果您要为此功能创建一个新的存储过程,那么您可以以更好的方式获得此功能,然后动态。

您应该根据是否传递CompanyName来执行不同的选择查询。

您可以简单地按照以下方式存储过程。

Create PROCEDURE [dbo].[spCompanyName]              
(              
    @CompanyName VARCHAR(100))
    AS
    Begin
    IF LEN(@CompanyName) > 0               
    BEGIN
        Select EmpID,CompanyName FROM Employee WHERE RTRIM(LTRIM(CompanyName)) like '' + @CompanyName + '%'
    END 
ELSE
BEGIN
        Select EmpID,CompanyName FROM Employee
    END
END

我不确定为什么你需要在参数值中传递这么多单引号,但对我而言,看起来你可以按照以下简单的方式执行该过程。

EXEC spCompanyName @CompanyName='So Unique, formerly Sofia''s'
EXEC spCompanyName @CompanyName='Absolute''s,Strategy''s'

这可以帮助您找到解决方案。