处理动态sql中单引号的正确方法?

问题描述 投票:0回答:1

我在下面有一个动态sql查询来创建函数,我用4x单引号替换了单引号,但是它不起作用。

EXEC(
'
CREATE  OR ALTER FUNCTION dbo.fnGetNumberFromPCN
(
    @PCN VARCHAR(50)
)
RETURNS BIGINT
AS
BEGIN

        --Init
        DECLARE @Number BIGINT = NULL

        --Get
        SELECT @Number = CASE WHEN PATINDEX(''''%[^0-9]%'''',STUFF(V.YourString,1,PI.I-1,'''''''')) > 0 
                                 THEN CONVERT(BIGINT, SUBSTRING(V.YourString,PI.I,PATINDEX''''%[^0-9]%'''',STUFF(V.YourString,1,PI.I-1,''''''''))-1))
                                 ELSE 0
                            END
        FROM (VALUES(@PCN),(@PCN))V(YourString)
             CROSS APPLY (VALUES(PATINDEX''''%[1-9]'''', V.YourString)))PI(I)

        --Finally
        RETURN @Number
END
')
GO
sql-server tsql escaping dynamic-sql single-quotes
1个回答
0
投票

只需检查生成的SQL,您将看到问题:

declare @sql varchar(max) = '
CREATE  OR ALTER FUNCTION dbo.fnGetNumberFromPCN
(
    @PCN VARCHAR(50)
)
RETURNS BIGINT
AS
BEGIN

        --Init
        DECLARE @Number BIGINT = NULL

        --Get
        SELECT @Number = CASE WHEN PATINDEX(''''%[^0-9]%'''',STUFF(V.YourString,1,PI.I-1,'''''''')) > 0 
                                 THEN CONVERT(BIGINT, SUBSTRING(V.YourString,PI.I,PATINDEX''''%[^0-9]%'''',STUFF(V.YourString,1,PI.I-1,''''''''))-1))
                                 ELSE 0
                            END
        FROM (VALUES(@PCN),(@PCN))V(YourString)
             CROSS APPLY (VALUES(PATINDEX''''%[1-9]'''', V.YourString)))PI(I)

        --Finally
        RETURN @Number
END
'
print @sql
--exec (@sql)

输出

CREATE  OR ALTER FUNCTION dbo.fnGetNumberFromPCN
(
    @PCN VARCHAR(50)
)
RETURNS BIGINT
AS
BEGIN

        --Init
        DECLARE @Number BIGINT = NULL

        --Get
        SELECT @Number = CASE WHEN PATINDEX(''%[^0-9]%'',STUFF(V.YourString,1,PI.I-1,'''')) > 0 
                                 THEN CONVERT(BIGINT, SUBSTRING(V.YourString,PI.I,PATINDEX''%[^0-9]%'',STUFF(V.YourString,1,PI.I-1,''''))-1))
                                 ELSE 0
                            END
        FROM (VALUES(@PCN),(@PCN))V(YourString)
             CROSS APPLY (VALUES(PATINDEX''%[1-9]'', V.YourString)))PI(I)

        --Finally
        RETURN @Number
END

失败的原因

Msg 102, Level 15, State 1, Procedure fnGetNumberFromPCN, Line 15 [Batch Start Line 0]
Incorrect syntax near ''.
© www.soinside.com 2019 - 2024. All rights reserved.