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
答案 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, '+', ', ');