Как заменить табличную переменную в T-SQL 2008 string contatenation

#sql #tsql #sql-server-2008

#sql #tsql #sql-server-2008

Вопрос:

У меня есть UDF, запущенный в SQL 2000, который использует table var для возврата строки, разделенной запятыми, из нескольких строк данных:

 CREATE FUNCTION [dbo].[ReturnVisitsTaskNos]
   (  @MainlinePlanID int )
   RETURNS varchar(1000)
AS
   BEGIN
      DECLARE @TaskNoTable table
         (  TaskNo varchar (15)  )
      DECLARE @TaskList varchar(1000)
      SET @TaskList = ''
      INSERT INTO @TaskNoTable
         SELECT TaskNo
         FROM MainlinePlanTask
         WHERE MainlinePlanID = @MainlinePlanID
      IF @@ROWCOUNT > 0
         UPDATE @TaskNoTable
            SET @TaskList = ( @TaskList   TaskNo   ', ' )
      RETURN substring( @TaskList, 1, ( len( @TaskList ) - 1 ))
   END
  

Возможно ли заменить код table var чем-то более быстрым теперь, когда он выполняется на SQL 2008?

Спасибо!

Комментарии:

1. Я не вижу, где вы используете курсор… вы вызываете свою функцию внутри одного?

2. Извините… следовало бы сказать, используя table.. отредактировано 🙂

3. 2000 ИЛИ 2008? Заголовок и теги говорят одно, вопрос — другое…

4. @Martin: Я думаю, что это база данных, которая, вероятно, была обновлена с 2k, и операционная система пытается реорганизовать некоторые исходные функциональные возможности.

Ответ №1:

Я не могу ручаться за производительность, но если вы используете предложение FOR XML, подобное этому, вы определенно получите более чистый T-SQL в имеющейся у вас функции, без временной таблицы и курсора.

Из статьи:

Вот очень простой пример t-sql, использующий FOR XML PATH() для конкатенации значений строк sql в качестве примера конкатенации sql в MSSQL.

 SELECT
  STUFF(
    (
    SELECT
      ' '   Description
    FROM dbo.Brands
    FOR XML PATH('')
    ), 1, 1, ''
  ) As concatenated_string
  

Ваша обновленная функция может выглядеть примерно так:

 CREATE FUNCTION [dbo].[ReturnVisitsTaskNos]
   (  @MainlinePlanID int )
   RETURNS varchar(1000)
AS
   BEGIN

    RETURN
      SELECT STUFF((
    SELECT
      TaskNo   ', '
    FROM MainlinePlanTask
    WHERE MainlinePlanID = @MainlinePlanID
    FOR XML PATH('')
    ), 1, 0, ''
  ) As concatenated_string

   END
  

Ответ №2:

 CREATE FUNCTION [dbo].[ReturnVisitsTaskNos]
   (  @MainlinePlanID int )
   RETURNS varchar(1000)
AS
   BEGIN
      DECLARE @TaskList varchar(1000)

      SET @TaskList = ''

      SELECT @TaskList = ( @TaskList   TaskNo   ', ' )
      FROM MainlinePlanTask
      WHERE MainlinePlanID = @MainlinePlanID

      RETURN substring( @TaskList, 1, ( len( @TaskList ) - 1 ))
   END