对于重命名约束的SQL Server过程感到困惑

时间:2014-08-07 14:44:32

标签: sql sql-server tsql

好吧我是SQL Server的新手,我有一个脚本来重命名数据库中的约束以遵守命名标准。我想解释一下,因为我很困惑。

IF @PrimaryKeys = 1
BEGIN
    SELECT @sql = @sql + @cr + @cr + '/* Primary Keys */' + @cr;
    SELECT @sql = @sql + @cr + 'EXEC sp_rename @objname = ''' 
    + REPLACE(name, '''', '''''') + ''', @newname = ''PK_' 
    + LEFT(REPLACE(object_name(parent_object_id), '''', ''), @TableLimit) + ''';'
      FROM sys.key_constraints
      WHERE type = 'PK'
      AND is_ms_shipped = 0;
END

我最困惑的部分是replace(name, '''', '''''')。我知道它正在接受一个字符串,在其中找到一些东西,并替换那些东西,但我不明白所有的单引号。

3 个答案:

答案 0 :(得分:2)

用双引号替换单引号:

before after
------ -----
it's   it''s

答案 1 :(得分:0)

这将有助于您更好地阅读。希望能帮助到你。对于带引号的东西,可能你有单引号的PK并将其作为输入参数传递,所有单引号都需要重复一次。

尝试将此sting分配给变量这不会起作用

DECLARE @testStr VARCHAR(50)

SET testStr = 'This won't work'
SET testStr = 'This won''t work'

<强> SCRIPT:

DECLARE @sql VARCHAR(MAX) =''
DECLARE @cr VARCHAR(20) = CHAR(13)+CHAR(10)
DECLARE @PrimaryKeys INT = 1
DECLARE @TableLimit int =10

IF @PrimaryKeys = 1
    BEGIN 
    SELECT @sql = @sql + @cr + @cr + '/* Primary Keys */' + @cr; 
    SELECT @sql = @sql + @cr + 'EXEC sp_rename @objname = ''' + REPLACE(name, '''', '''''') + ''', @newname = ''PK_' + LEFT(REPLACE(OBJECT_NAME(parent_object_id), '''', ''), @TableLimit) + ''';'
                                                         FROM sys.key_constraints
                                                         WHERE type = 'PK'
                                                           AND is_ms_shipped = 0;
    END
PRINT @sql

答案 2 :(得分:0)

您的脚本正在生成名为&#39; Dynamic SQL&#39;并将其存储在变量中。它将几个字符串,列和其他内容连接成一个长文本值。

但是,SQL Server将文本值理解为以单引号(撇号)开头和结尾的内容。如果你需要将单个引号传递给该文本值(如此处),你实际上必须同时输出两个引号 - SQL将理解你不会试图指示文本字符串的开头或结尾,但反而想要保留撇号。

所以,你的REPLACE()函数填充了额外的撇号,这样你的列的名称(例如,&#34; O&#39; Laughlin&#34;)将被串联读取为&#34 ; O&#39;&#39;授予Laughlin&#34;然后被理解为实际上代表了&#34;劳克林&#34;。