将含浮点/字符型的逗号分隔字符串插入临时表报错求助
解决字符串拆分插入临时表的语法错误问题
你的问题核心在于生成动态SQL时,没给每个字符串值加上单引号。原代码生成的插入语句是这样的:
insert into #Temp values (e65.89),(f34.yy),(sw21.67),(aqw21),(g45.g4);
SQL Server会把e65.89这类无引号的内容当成标识符(比如列名、变量名),而非字符串常量,所以才会抛出语法错误。
下面给你两种可行的解决方案:
方案1:修正动态SQL的引号问题
只需要在替换逗号时,给每个值前后加上单引号,生成符合SQL规范的字符串常量格式:
CREATE TABLE #Temp (SNo INT IDENTITY(1,1),Code VARCHAR(max)) Declare @value varchar(max) set @value = 'e65.89,f34.yy,sw21.67,aqw21,g45.g4' -- 用两个单引号表示SQL中的一个单引号,给每个值包裹引号后拆分 DECLARE @InsertStatement varchar(max) = 'insert into #Temp values ('''+REPLACE(@value ,',','''),(''')+''');'; EXEC (@InsertStatement); SELECT * FROM #Temp;
生成的正确插入语句会变成:
insert into #Temp values ('e65.89'),('f34.yy'),('sw21.67'),('aqw21'),('g45.g4');
这样SQL就能正确识别每个字符串值了。
方案2:使用STRING_SPLIT函数(推荐,更安全)
如果你的SQL Server版本是2016及以上,建议用内置的STRING_SPLIT函数拆分字符串,避免动态SQL的潜在注入风险,代码也更简洁:
CREATE TABLE #Temp (SNo INT IDENTITY(1,1),Code VARCHAR(max)) Declare @value varchar(max) set @value = 'e65.89,f34.yy,sw21.67,aqw21,g45.g4' -- 直接拆分字符串并插入临时表 INSERT INTO #Temp(Code) SELECT value FROM STRING_SPLIT(@value, ','); SELECT * FROM #Temp;
这个函数会自动把逗号分隔的字符串拆分成单独的行,直接插入即可,既安全又容易维护。
内容的提问来源于stack exchange,提问作者ASHWANT
相关产品推荐
相关产品推荐

