SQL查询从字符串吐

时间:2019-01-08 22:44:51

标签: sql sql-server split

declare @st1 varchar(50) = 'Today+Test+12456'

我正尝试如下插入临时表。

CREATE TABLE #TempTable (
    Id INT IDENTITY,
    col1 varchar(50), 
    col2 varchar(50), 
    col3 nvarchar(50)
);
insert into #TempTable select Today,Test,12456;

例如:select Today,Test,12456

我不想像下面这样查询行。

Today
Test
123456

3 个答案:

答案 0 :(得分:2)

可能有帮助

DECLARE @input NVARCHAR(50) = 'Today+Test+12456+'
DECLARE @ColumnValue NVARCHAR(100)
DECLARE @Index INT
DECLARE @SelectString   [nvarchar] (500) = 'SELECT ' 
 WHILE CHARINDEX('+', @input) > 0
 BEGIN
    SELECT @Index  = CHARINDEX('+', @input)  
    SELECT @ColumnValue = SUBSTRING(@input, 1, @Index-1)
    Set @SelectString = @SelectString + '''' +@ColumnValue + ''', '
    SELECT @input = SUBSTRING(@input, @Index + 1, LEN(@input) - @Index)
 END
SELECT @SelectString = SUBSTRING(@SelectString,0, LEN(@SelectString))
EXEc sp_sqlexec @SelectString

答案 1 :(得分:1)

好的,根据我从评论中收集的信息。

这里有两个选择。 XML方法和ParseName()。如果文本中包含句点和/或超过4个项目,则ParseName()将失败

declare @st1 varchar(50) = 'Today+Test+12456'

Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
      ,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
      ,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
From  (Select Cast('<x>' + replace((Select replace(@st1,'+','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A 



Select Pos1 = parsename(tStr,3)
      ,Pos2 = parsename(tStr,2)
      ,Pos3 = parsename(tStr,1)
From  ( values(replace(@st1,'+','.'))) B1(tStr)

两者都会返回

Pos1    Pos2    Pos3
Today   Test    12456
  

编辑

我看到您已经更新了问题。

如果您真正要使用动态SQL,则可能很简单

CREATE TABLE #TempTable (
Id INT IDENTITY,
col1 varchar(50), 
col2 varchar(50), 
col3 nvarchar(50)
);


Declare @st1 varchar(50) = 'Today+Test+12456'
Declare @SQL varchar(max) = 'Insert Into #TempTable values ('''+replace(@st1,'+',''',''')+''')'
Exec(@SQL)

答案 2 :(得分:0)

不确定我是否正确理解或您的定义需要澄清,但是...我认为以下查询将解决您的请求:

DECLARE @st1 VARCHAR(50) = 'Today+Test+12456';
INSERT INTO @TempTable
SELECT 'SELECT ' + REPLACE(@st1, '+', ', ');