【问题标题】:SQL query to spit from string从字符串吐出的 SQL 查询
【发布时间】:2019-01-08 22:44:50
【问题描述】:
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

【问题讨论】:

  • 这些列的值是什么? @ST1 是标量变量,不能在 FROM 子句中使用。
  • 我以为@AngelM.,但操作不是在寻找行。仍然有类似的骗子,这取决于他们的最终要求。
  • SQL Server 在设计上是声明性的。它不支持宏替换,您必须用逗号替换 + 并作为动态 sql 执行
  • @JohnCappelletti 我可以用逗号替换它。但是我怎么得到它呢?
  • T-SQL split string的可能重复

标签: sql sql-server split


【解决方案1】:

好的,根据我从 cmets 那里收集到的信息。

这里有两个选项。 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)

【讨论】:

  • 这是我所期望的。欣赏它
  • @user3335081 乐于助人
  • @user3335081 请参阅编辑。不需要那种复杂的动态 SQL
【解决方案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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 没有。我希望插入到 @TempTable 中选择 Today, Test, 12456
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多