我已经从几个表格中形成了一个视图。例如,此视图包含“订单号”,“名称”和“日期时间”列。
举例
原文:
| Order number | Name | Datetime |
|-------------: |-------- |------------------------- |
| -1094 | Bob | 2019-04-02 12:58:56.000 |
| -1989 | Anna | 2018-03-27 09:13:53.000 |
| -43 | Peter | 2018-04-16 10:20:40.000 |
| -1094 | Dieter | 2017-12-30 11:28:23.000 |
| -1094 | Sabi | 2019-04-02 12:58:56.000 |
我编写了一个函数,该函数添加名称并将其返回给我。 问题在于查询要花费很多时间来显示结果。 对于大约1000条记录,大约需要1个小时。这太慢了。 希望您能给我一些有关如何改善功能或完全不同的解决方案的提示。
USE [****]
GO
/****** Object: UserDefinedFunction [dbo].[*_***_sfGetProjectName] Script Date: 19.06.2019 14:03:18 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[*_***_sfGetProjectName](@starttime datetime) RETURNS VARCHAR(MAX)
BEGIN
DECLARE tmpCursor CURSOR FOR SELECT Projektname FROM dbo.*_***_Sollzeit_Istzeit2 WHERE Startzeit = @starttime
DECLARE @tmpProjectName VARCHAR(MAX)
DECLARE @ReturnProjectName VARCHAR(MAX)
DECLARE @tmpCursorRows INTEGER
SET @tmpProjectName = ''
SET @ReturnProjectName = ''
SET @tmpCursorRows = 0
OPEN tmpCursor
SET @tmpCursorRows = @@CURSOR_ROWS
FETCH NEXT FROM tmpCursor INTO @tmpProjectName
WHILE @@FETCH_STATUS = 0
BEGIN
IF @tmpCursorRows > 1
BEGIN
SET @ReturnProjectName = @ReturnProjectName + '_' + @tmpProjectName
END
ELSE
BEGIN
SET @ReturnProjectName = @tmpProjectName
END
FETCH NEXT FROM tmpCursor INTO @tmpProjectName
END
CLOSE tmpCursor
DEALLOCATE tmpCursor
RETURN @ReturnProjectName
END;
我想添加所有名称,其中Datetime列的值相等。
结果:
| Order number | Name | Datetime |
|-------------: |---------- |------------------------- |
| -1094 | Bob_Sabi | 2019-04-02 12:58:56.000 |
| -1989 | Anna | 2018-03-27 09:13:53.000 |
| -43 | Peter | 2018-04-16 10:20:40.000 |
| -1094 | Dieter | 2017-12-30 11:28:23.000 |
答案 0 :(得分:0)
如果您使用的是SQL Server 2017或更高版本,请使用string_agg
。对于较低的版本,请结合使用stuff
和for xml
:
对于SQL Server 2016或更低版本:
SELECT DISTINCT [Order number],
(
STUFF(
(
SELECT '_' + Name
FROM <YourViewNameHere> As T1
WHERE T1.[Datetime] = T0.[Datetime]
-- Unremark if you want the names to be sorted in the output
-- ORDER BY Name
FOR XML PATH('')
), 1, 1, '')
) As Name ,
[Datetime]
FROM <YourViewNameHere> As T0
对于Sql Server 2017或更高版本:
SELECT [Order number], STRING_AGG(Name, '_') As Name, [Datetime]
FROM <YourViewNameHere>
GROUP BY [Order number], [Datetime]