如何在T-SQL 2008字符串连接中替换表变量

时间:2011-04-14 14:51:23

标签: sql tsql sql-server-2008

我在SQL 2000中运行了一个UDF,它使用表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

是否可以在SQL 2008上运行时更快地替换表var代码?

谢谢!

2 个答案:

答案 0 :(得分:3)

我不能保证性能,但是如果你使用FOR XML子句like this,你肯定会在你拥有的函数中得到更干净的T-SQL,而不需要临时表和游标。

来自文章:

  

这是一个非常简单的t-sql示例   使用FOR XML PATH()以sql   将字符串值连接为示例   MSSQL中的SQL连接。

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

答案 1 :(得分:0)

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