我正在尝试将数据插入列数据类型为#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>
任何想法,为什么要这样做?另外,如果有人可以提供其他替代解决方案,因为我将不得不在运行时进行插入查询。
答案 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在连接期间将忽略空值,并且不添加 空值之间的分隔符。