好吧我是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, '''', '''''')
。我知道它正在接受一个字符串,在其中找到一些东西,并替换那些东西,但我不明白所有的单引号。
答案 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;。