我在表中有許多記錄,如下所示,其中我已經為您放置了表的結構和沖突的記錄。
CREATE TABLE [dbo].[TblHilfeStrings]
(
[Id] [int] IDENTITY(1,1) NOT NULL,
[HilfeStrings] [varchar](200) NOT NULL,
CONSTRAINT [PK_TblHilfeStrings]
PRIMARY KEY CLUSTERED ([Id] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
這是我的插入查詢:
SET IDENTITY_INSERT [dbo].[TblHilfeStrings] ON
INSERT INTO [dbo].[TblHilfeStrings] ([Id], [HilfeStrings])
VALUES (1, N'Startzeit_ist_von_8.00_bis_20.00_Uhr,_Abfahrt_um_23.00_Uhr')
INSERT INTO [dbo].[TblHilfeStrings] ([Id], [HilfeStrings])
VALUES (2, N'Versp?tung_von_11_bis_12_Uhr_wegen_?len_der_Maschine')
INSERT INTO [dbo].[TblHilfeStrings] ([Id], [HilfeStrings])
VALUES (3, N'Wassermotor_und_Dampfgeneratorausfall_und_dessen_Reparatur_von_8.00_bis_12.00_Uhr,_die_auf_morgen_verschoben_wurde')
INSERT INTO [dbo].[TblHilfeStrings] ([Id], [HilfeStrings])
VALUES (4, N'Die_gesendeten_Spesen_wurden_vom_Arbeitgeber_nicht_genehmigt')
SET IDENTITY_INSERT [dbo].[TblHilfeStrings] OFF
問題是什么?實際上,我需要一個函式,我可以使用該函式從 _ 字符所在的第三個位置到字串末尾輸入一個字符及其重復位置(例如 _ 和 3),并向我顯示從 _ 到的字符結束。該結構應如下所示:
| 豪普賽特 | 查赫德弦 | Anzahl der Zeichen |
|---|---|---|
| Startzeit_ist_von_8.00_bis_20.00_Uhr,_Abfahrt_um_23.00_Uhr | 8.00_bis_20.00_Uhr,_Abfahrt_um_23.00_Uhr | 40 |
同時,我在 Stack Overflow 網站上進行了很多搜索,但沒有找到與此請求類似的任何內容。
uj5u.com熱心網友回復:
我寫了以下函式:
CREATE FUNCTION dbo.SubStringByPosition (@text varchar(256), @search_exp varchar(1), @position int)
RETURNS varchar(256)
WITH EXECUTE AS CALLER
AS
BEGIN
declare @len int = 0;
declare @i int = 0;
declare @pos int = 0;
set @len = len(@text);
while(@i < @position and @pos < @len)
begin
set @pos = charindex(@search_exp, @text, @pos 1)
set @i = @i 1
end
RETURN(substring(@text, @pos 1, @len - @pos));
END;
嘗試在您的查詢中使用此功能:
SELECT [Id], [HilfeStrings], dbo.SubStringByPosition(a.HilfeStrings, '_', 3) AS SubStr
FROM [TestDb].[dbo].[TblHilfeStrings] a
如果您需要構建表格作為示例,請使用以下代碼:
SELECT AA.*, LEN(AA.[Chaehd-String]) AS 'Anzahl der Zeichen' FROM (
SELECT [HilfeStrings] AS 'Hauptsaite', dbo.SubStringByPosition(a.HilfeStrings, '_', 3) AS 'Chaehd-String'
FROM [dbo].[TblHilfeStrings] a) AS AA
uj5u.com熱心網友回復:
嘗試以下功能:
CREATE FUNCTION [dbo].[GetStringAfterSpecificCharacter]
(
@MainString NVARCHAR(4000),
@DelimiterCharacter NCHAR(1),
@DelimiterPlace int
)
RETURNS Table
AS
RETURN
(
WITH SplitedStrings(Ends,Endsp)
AS (
SELECT 0 AS Ends, CHARINDEX(@DelimiterCharacter,@MainString) AS Endsp
UNION ALL
SELECT Endsp 1, CHARINDEX(@DelimiterCharacter,@MainString,Endsp 1)
FROM SplitedStrings
WHERE Endsp > 0
)
SELECT f.Hauptsaite, f.DataStr as [Chaehd-String], LEN(f.DataStr) as [Anzahl der Zeichen]
FROM (
SELECT 'RowId' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
'DataStr' = SUBSTRING(@MainString,Ends,LEN(@MainString)-(1 - Ends)),
Hauptsaite = @MainString
FROM SplitedStrings
) f WHERE f.RowId = @DelimiterPlace 1
)
根據您的要求,您需要一個Table-Valued函式。
如何使用:
select * from [dbo].[GetStringAfterSpecificCharacter] (N'Startzeit_ist_von_8.00_bis_20.00_Uhr,_Abfahrt_um_23.00_Uhr', N'_', 3)
結果:
| 豪普賽特 | 查赫德弦 | Anzahl der Zeichen |
|---|---|---|
| Startzeit_ist_von_8.00_bis_20.00_Uhr,_Abfahrt_um_23.00_Uhr | 8.00_bis_20.00_Uhr,_Abfahrt_um_23.00_Uhr | 40 |
通過以下方法,可以在主表上得到結果,在表上運行函式,得到主表所有記錄的完整輸出:
declare @DelimiterCharacter NCHAR(1) = N'_', @DelimiterPlace int = 3
declare @TempTable as table
(
Hauptsaite varchar(4000) ,
[Chaehd-String] varchar(4000),
[Anzahl der Zeichen] int
)
declare @TempMainTable as table
(
[Id] [int] NULL,
[HilfeStrings] [varchar](200) NULL
)
insert into @TempMainTable
select * from [dbo].[TblHilfeStrings]
while((select count(*) as cntRecs from @TempMainTable) > 0)
begin
insert into @TempTable (Hauptsaite , [Chaehd-String] , [Anzahl der Zeichen])
SELECT d.Hauptsaite , d.[Chaehd-String], d.[Anzahl der Zeichen] from [dbo].[GetStringAfterSpecificCharacter]((select top(1) t1.HilfeStrings from @TempMainTable t1 order by t1.Id) , @DelimiterCharacter , @DelimiterPlace) d
delete from @TempMainTable where Id = (select top(1) Id from @TempMainTable order by Id)
end
select te.Hauptsaite, te.[Chaehd-String], te.[Anzahl der Zeichen] from @TempTable te
結果:
| 豪普賽特 | 查赫德弦 | Anzahl der Zeichen |
|---|---|---|
| Startzeit_ist_von_8.00_bis_20.00_Uhr,_Abfahrt_um_23.00_Uhr | 8.00_bis_20.00_Uhr,_Abfahrt_um_23.00_Uhr | 40 |
| Versp?tung_von_11_bis_12_Uhr_wegen_?len_der_Maschine | bis_12_Uhr_wegen_?len_der_Maschine | 34 |
| Wassermotor_und_Dampfgeneratorausfall_und_dessen_Reparatur_von_8.00_bis_12.00_Uhr,_die_auf_morgen_verschoben_wurde | und_dessen_Reparatur_von_8.00_bis_12.00_Uhr,_die_auf_morgen_verschoben_wurde | 76 |
| Die_gesendeten_Spesen_wurden_vom_Arbeitgeber_nicht_genehmigt | wurden_vom_Arbeitgeber_nicht_genehmigt | 38 |
如果你覺得這個答案有用,請把它打勾為最喜歡的答案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/504679.html
