2010-04-08 61 views
2

几天前我问了一个关于通过运行SELECT将数据移动到另一个服务器来创建INSERT的问题。这很好用,直到我碰到一张表格中充满HTML和撇号的表格。处理这个问题的最好方法是什么?没有太多的行,因此作为“复制和粘贴”的最后手段是可行的。但是,最终我需要这样做,到那时表格可能会太大而无法复制和粘贴这些HTML字段。如何在SQL Server中使字段变为撇号?

这是我现在有:

select 'Insert into userwidget ([Type],[UserName],[Title],[Description],[Data],[HtmlOutput],[DisplayOrder],[RealTime],[SubDisplayOrder]) VALUES (' 
    + ISNULL('N'''+Convert(varchar(8000),Type)+'''','NULL') + ',' 
    + ISNULL('N'''+Convert(varchar(8000),Username)+'''','NULL') + ',' 
    + ISNULL('N'''+Convert(varchar(8000),Title)+'''','NULL') + ',' 
    + ISNULL('N'''+Convert(varchar(8000),Description)+'''','NULL') + ',' 
    + ISNULL('N'''+Convert(varchar(8000),Data)+'''','NULL') + ',' 
    + ISNULL('N'''+Convert(varchar(8000),HTMLOutput)+'''','NULL') + ',' 
    + ISNULL('N'''+Convert(varchar(8000),DisplayOrder)+'''','NULL') + ',' 
    + ISNULL('N'''+Convert(varchar(8000),RealTime)+'''','NULL') + ',' 
    + ISNULL('N'''+Convert(varchar(8000),SubDisplayOrder)+'''','NULL') + ')' 
    from userwidget 

这是工作,除了在HTMLOutput领域那些讨厌的撇号的罚款。我可以通过在撇号上加倍查询来逃避它们,还是有一种编码字段结果的方式,所以它不会有问题?

回答

5

您可以用双撇号替换单撇号。

ISNULL('N'''+ REPLACE(Convert(varchar(8000),Type), '''', '''''') + '''','NULL') + ',' 
+0

+1:为了正确,实际回答问题,并举例说明。 – 2010-04-08 15:47:19

+0

这实际上是我正在寻找! – Mikecancook 2010-04-09 15:33:50

4

您应该使用参数,而不是将值注入到SQL查询中。

+0

这是严格背部采用了演示数据库结束。我们做了一些改变,并希望将它们带到不同的演示版本。 – Mikecancook 2010-04-08 15:41:51

+0

OP提供的是旧式的将数据从一个数据模型版本迁移到另一个数据模型的方法。 – 2010-04-08 15:48:48

-1

使用QUOTENAME功能

declare @valueAsNull as varchar(10) 
set @valueAsNull = quotename('NULL','''') 

SELECT 'Insert into userwidget ([Type],[UserName],[Title],[Description],[Data],[HtmlOutput],[DisplayOrder],[RealTime],[SubDisplayOrder]) VALUES (' + 
    REPLACE(QUOTENAME(Convert(varchar(8000),ISNULL(Type,'NULL'),''''), @valueAsNull,'NULL') + ', '   
    REPLACE(QUOTENAME(Convert(varchar(8000),ISNULL(Username,'NULL'),''''), @valueAsNull,'NULL') + ', ' 
    REPLACE(QUOTENAME(Convert(varchar(8000),ISNULL(Title,'NULL'),''''), @valueAsNull,'NULL') + ', '    
    REPLACE(QUOTENAME(Convert(varchar(8000),ISNULL(Description,'NULL'),''''), @valueAsNull,'NULL') + ', '  
    REPLACE(QUOTENAME(Convert(varchar(8000),ISNULL(Data,'NULL'),''''), @valueAsNull,'NULL') + ', '  
    REPLACE(QUOTENAME(Convert(varchar(8000),ISNULL(HTMLOutput,'NULL'),''''), @valueAsNull,'NULL') + ', ' 
    REPLACE(QUOTENAME(Convert(varchar(8000),ISNULL(DisplayOrder,'NULL'),''''), @valueAsNull,'NULL') + ', '  
    REPLACE(QUOTENAME(Convert(varchar(8000),ISNULL(RealTime,'NULL'),''''), @valueAsNull,'NULL') + ', '  
    REPLACE(QUOTENAME(Convert(varchar(8000),ISNULL(SubDisplayOrder,'NULL'),''''), @valueAsNull,'NULL') + ')'   
FROM userwidget 
+0

我刚刚注意到它试图向自己插入相同的数据,使用DTS/SSIS或纯数据导入不是更好吗? – bonskijr 2010-04-08 16:06:19

+0

Quotename仅适用于sysnames aka标识符。从Microsoft BOL:| 'character_string'是一个Unicode字符数据的字符串。 character_string是sysname,限制为128个字符。大于128个字符的输入返回NULL。 | OP的Data和HTMLOutput列很可能超过128个字符。对不起,这个答案是一个小姐。加上总是unicode thingie。 – ErikE 2010-04-08 22:17:59