3

重複の可能性:
sqlserver で単一引用符をエスケープするにはどうすればよいですか?

このリンクからデータベース上のすべてをドロップする以下のスクリプトを取得しました。この行で実行するとエラーになります。

SET @statement = '
IF(@type = 'F') or (@type = 'C') or (@type = 'D') or (@type='F') or (@type='K')

理由は、一重引用符だからです。このエラーを修正する方法を知りたいですか?

/*** drop (pretty much) everything before rebuilding the database ***/
DECLARE
    OBJECTS CURSOR FOR SELECT
        so.name,
        so.type,
        so.type_desc,
        p.name AS parentName
    FROM
        sys.objects AS so
    LEFT JOIN sys.objects AS p ON so.parent_object_id = p.object_id
    WHERE
        so.schema_id = 1
    ORDER BY
        CASE
    WHEN so.type = 'F' THEN
        0
    WHEN so.type = 'TR' THEN
        1
    WHEN so.type = 'U' THEN
        2
    WHEN so.type = 'F' THEN
        3
    ELSE
        4
    END OPEN OBJECTS DECLARE
        @name AS nvarchar (MAX) DECLARE
            @type AS nvarchar (2) DECLARE
                @type_desc AS nvarchar DECLARE
                    @parentName AS nvarchar (MAX) DECLARE
                        @statement AS nvarchar (MAX) FETCH NEXT
                    FROM
                        OBJECTS INTO @name,
                        @type,
                        @type_desc,
                        @parentName
                    WHILE @@FETCH_STATUS = 0
                    BEGIN

                    SET @statement = '    IF(@type = ' F ')
BEGIN
PRINT ' DROPING FK : ' + @name + ' OF type ' + @type + ' (' + @type_desc + ') '
SET @statement = ' ALTER TABLE ' + @parentName + ' DROP CONSTRAINT ' + @name
EXECUTE(@statement)
END
ELSE IF (@type = ' TR ')
BEGIN
PRINT ' DROPING TRIGGER : ' + @name + ' OF type ' + @type + ' (' + @type_desc + ') '
SET @statement = ' DROP TRIGGER ' + @name
EXECUTE(@statement)
END
ELSE IF (@type = ' U ')
BEGIN
PRINT ' DROPING TABLE : ' + @name + ' OF type ' + @type + ' (' + @type_desc + ') '
SET @statement = ' DROP TABLE ' + @name
EXECUTE(@statement)
END
ELSE IF (@type = ' FN ')
BEGIN
PRINT ' DROPING FUNCTION : ' + @name + ' OF type ' + @type + ' (' + @type_desc + ') '
SET @statement = ' DROP FUNCTION ' + @name
EXECUTE(@statement)
END
ELSE
PRINT ' Didn 't drop object ' + @name + ' of type ' + @type + ' (' + @type_desc + ')'    FETCH NEXT
                    FROM
                        OBJECTS INTO @name,
                        @type,
                        @type_desc,
                        @parentName
                    END CLOSE OBJECTS DEALLOCATE OBJECTS
4

3 に答える 3

6

準備されたステートメント内で一重引用符を使用する場合は、別の一重引用符でエスケープします。例:

SET @statement = 'world''s view';
SET @statement2 = 'world''s view';

上記の例から

SET @statement = '
                IF(@type = ''F'') or (@type = ''C'')  or
                  (@type = ''D'') or (@type=''F'') or
                  (@type=''K'')'

-- the strings are all red.
于 2012-11-15T04:53:01.440 に答える
0

次のようになります。

SET @statement = 'IF(@type = ''F'') or (@type = ''C'') or (@type = ''D'') or (@type=''F'') or (@type=''K'')'

ラージ

于 2012-11-15T04:58:19.077 に答える
0

一重引用符は、SQL で文字列リテラルを表すために使用されます。一重引用符を明示的に挿入する必要がある場合は、二重一重引用符 ('')を使用する必要があります。

于 2012-11-15T04:53:47.807 に答える