-1

我有一个这样的名称值对表

属性 - EmployeeId

我的员工表如下所示:-

EmployeeId  FirstName Middle LastName

1           John             Smith

2           Rick      Steve  James

3           Maddy     Y      Angela

现在我的 TVP 可以包含多个或单个 EmployeeId

我想在一个参数中将 TVP 中所有人的全名加起来。

IE

例如。如果我在 TVP 中收到 1 和 3

我的输出应该是 John Smith,Maddy Y Angela。

我需要在其中使用游标吗?

实现这一目标的最佳方法是什么?

编辑

TVP 的 Scipt 如下:-

CREATE TYPE [dbo].[Employee] AS TABLE(    [EmployeeId] [uniqueidentifier] NULL)GO

所需的输出是用 TVP 逗号分隔的员工全名。

4

2 回答 2

1

假设您有一个表类型,例如:

CREATE TYPE dbo.TVPTypeName AS TABLE(EmployeeId INT PRIMARY KEY);

然后你可以执行一个连接:

CREATE PROCEDURE dbo.foo
  @bar dbo.TVPTypeName READONLY
AS
BEGIN
  SET NOCOUNT ON;

  SELECT STUFF((SELECT ',' 
    + e.FirstName 
    + COALESCE(' ' + NULLIF(RTRIM(e.Middle),''), ' ') 
    + e.LastName 
  FROM dbo.Employees AS e
  INNER JOIN @bar AS b
  ON e.EmployeeId = b.EmployeeId
  FOR XML PATH(''),TYPE).value('.[1]','nvarchar(max)'),1,1,'');
END
GO
于 2013-08-12T17:18:21.093 回答
0
CREATE TYPE dbo.IntArray AS TABLE(IntValue INT PRIMARY KEY);
GO
CREATE TABLE dbo.Employee(
    EmployeeID INT IDENTITY(1,1) PRIMARY KEY,
    FirstName NVARCHAR(50) NOT NULL,
    MiddleName NVARCHAR(50) NULL,
    LastName NVARCHAR(50) NOT NULL
);
GO
INSERT INTO dbo.Employee VALUES ('John',NULL,'Smith');
INSERT INTO dbo.Employee VALUES ('Rick','Steve','James');
INSERT INTO dbo.Employee VALUES ('Maddy','Y','Angela');
GO
CREATE PROCEDURE dbo.CocoJambo(@pEmployee dbo.IntArray READONLY)
AS
BEGIN
    DECLARE @Result NVARCHAR(MAX);
    SELECT @Result=ISNULL(@Result,'')+','+FirstName+ISNULL(' '+MiddleName,'')+' '+LastName
    FROM dbo.Employee e INNER JOIN @pEmployee p ON e.EmployeeID=p.IntValue;
    SELECT STUFF(@Result,1,1,'') AS [Result];
END;
GO
-- Test
DECLARE @p dbo.IntArray;
INSERT INTO @p VALUES (1);
INSERT INTO @p VALUES (3);
EXEC dbo.CocoJambo @pEmployee=@p;
/*
Result
-------------------------
John Smith,Maddy Y Angela
*/
于 2013-08-12T17:47:02.413 回答