我试图编写一个存储过程,该过程接受一个字符串参数,并以句号分隔的每个字符返回它。
例如,我希望SP接受参数DOG并返回D.O.G。
我尝试如下使用STRING_SPLIT函数:
select STRING_SPLIT(@myString, '')
,但它似乎与我使用的SQL版本(2014)不兼容(错误消息说它不是公认的函数)。即使它确实起作用,我也不确定如何插入句号。
似乎应该有一种简单的方法来做到这一点,但我只是找不到它!
如果您需要更多信息,请告诉我。
非常感谢。
答案 0 :(得分:5)
如果我很好理解,这是我现在可以想到的最好方法,使用问题T-SQL Split Word into characters
的答案with cte as (
select
substring(a.b, v.number+1, 1) as col
,rn = ROW_NUMBER() over (order by (select 0))
from (select 'DOG' b) a
join master..spt_values v
on v.number < len(a.b)
where v.type = 'P'
)
select distinct
STUFF((SELECT '.' + col FROM cte order by rn FOR XML PATH('')),1,1,'') as col
from cte
答案 1 :(得分:5)
首先误解了问题。此答案使用NGRams8K
将参数拆分为字符,然后使用from sqlalchemy import Column, create_engine, engine
from sqlalchemy.types import Integer, Float, String, Date
conn_string = {'drivername':'postgresql', 'username':'****',
'password':'****', 'host':'****', 'port':5432,
'database':'****'}
conn = create_engine(engine.url.URL(**conn_string))
Base = declarative_base()
metadata = MetaData(conn)
class FOO(Base):
"""SQLalchemy object representing column types associated
with foo table in the MetaData database."""
__tablename__ = 'foo'
barbaz = Column(String(), index=True, unique=True,
primary_key=True,
CheckConstraint('length(barbaz) =10'))
name = Column(String(240))
latitude = Column(Float())
longitude = Column(Float())
class PHOO():
__tablename__ = ' '
table_id = Column(Integer, primary_key=True,
unique=True, index = True)
height = Column(Float(precision=53, asdescimal=True))
width = Column(Float(precision=53, asdescimal=True))
words = Column(String(500))
other_words = Column(String(500))
将其备份:
FOR XML PATH
答案 2 :(得分:2)
没有内置功能可以完成您要执行的操作,但是您可以使用简单的while循环轻松完成此操作。
遍历字符串中的每个字符并使用CONCAT:
DECLARE @InputString NVARCHAR(200);
DECLARE @Seperator CHAR(1);
DECLARE @OutputString NVARCHAR(MAX);
DECLARE @Counter INT;
SET @InputString = N'TestString';
SET @Seperator = '.';
SET @Counter = 1;
WHILE @Counter <= LEN(@InputString)
BEGIN
SET @OutputString = CONCAT(
@OutputString
, SUBSTRING(@InputString, @Counter, 1)
, @Seperator
);
SET @Counter = @Counter + 1;
END;
SELECT @OutputString;
答案 3 :(得分:1)
您可以对while
使用简单的stuff
循环:
declare @s varchar(max) ='dog'
declare @counter int = 0
declare @len int = len(@s)
while @counter < @len - 1
begin
set @s = stuff(@s, @len - @counter, 0, '.')
set @counter = @counter + 1
end
select @s + '.' as result
由于您输入的是简短的字符串,因此性能并不是一个大问题:我用8000个char字符串测试了此解决方案,结果立即返回。
结果: