SQL Server将字符串的长度减少到8000个字符

时间:2019-04-16 08:57:52

标签: sql sql-server ntext

我正在尝试将数据插入列数据类型为#always 0,1 in output df1 = pd.get_dummies(df.set_index('Name')['Class']).max(level=0).reset_index() #if need count values #df1 = pd.get_dummies(df.set_index('Name')['Class']).sum(level=0).reset_index() print (df1) Name FB GRS TWT 0 Aci 1 1 0 1 Dan 1 0 1 2 Ann 0 1 0 的表中。理想情况下,它应该存储超过8000个字符,但就我而言,它应将其减少到8000个字符。

我在运行时在Procedure中进行插入查询。下面是该过程正在执行的示例查询。

NTEXT

A,B,C等是示例数据,实际数据将在运行时标识,实际内容跨越8000个字符。同样,用于存储值的变量也定义为'INSERT INTO TMPRESULTS SELECT ('A' + ',' + 'B' + ',' + 'C') '

但是,当我尝试以下查询时,它确实在表中插入了8000个字符以上

NVARCHAR(MAX)

我假设在尝试用'+'号合并数据时,sql server将长度减少到8000。我不能使用INSERT INTO TMPRESULTS SELECT ('ABCdddd................') ,因为数据将超过256列/参数。 / p>

任何想法,为什么要这样做?另外,如果有人可以提供其他替代解决方案,因为我将不得不在运行时进行插入查询。

2 个答案:

答案 0 :(得分:3)

这在+ (String Concatenation) (Transact-SQL) - Remarks中有记录:

  

如果字符串的连接结果超出了限制   8,000个字节,结果被截断。但是,如果至少   串联的字符串是大值类型,不会发生截断。

对于varchar 8,000个字节将是8,000个字符,对于nvarchar将4,000个字节。

查询INSERT INTO TMPRESULTS SELECT ('A' + ',' + 'B' + ',' + 'C')中所有文字字符串均为非大值类型(实际上,它们均为varchar(1))。如果您将CONVERT / CAST中的一个varchar(MAX)改成INSERT INTO TMPRESULTS SELECT (CONVERT(varchar(MAX),'A') + ',' + 'B' + ',' + 'C'); ,将会解决问题:

nvarchar

如果您想要nvarchar,请确保也将文字字符串声明为INSERT INTO TMPRESULTS SELECT (CONVERT(nvarchar(MAX),N'A') + N',' + N'B' + N',' + N'C');

sed -Ez 's/<[^>]*>//g;s/\n+|\s+/,/g;' d

答案 1 :(得分:0)

在SQL Server 2017及更高版本中,有CONCAT_WS function可轻松执行串联。您还可以阅读有关CONCAT

的信息

所以,代替这个:

INSERT INTO TMPRESULTS SELECT ('A' + ',' + 'B' + ',' + 'C')

我们可以包含以下内容:

INSERT INTO TMPRESULTS SELECT CONCAT_WS(CAST(N',' AS NVARCHAR(MAX)),'A','B','C'))

我将下面的SQL Server 2017示例作为参考:

CREATE TABLE #tempValue(BigValue NVARCHAR(MAX))

INSERT INTO #tempValue
SELECT CONCAT_WS(CAST(N',' AS NVARCHAR(MAX)),REPLICATE('A',4000),REPLICATE('B',4000),REPLICATE('C',4000))

SELECT LEN(BigValue) FROM #tempValue -- 12002

此外,出于以下原因,CONCAT_WS更好:

  

如果CONCAT_WS接收到具有所有NULL值的参数,它将返回   一个类型为varchar(1)的空字符串。

     

CONCAT_WS在连接期间将忽略空值,并且不添加   空值之间的分隔符。