以下是我的程序。它工作正常。
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'
答案 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'
这可以帮助您找到解决方案。