を次のコードで分割関数を作成できます。
CREATE FUNCTION dbo.split (
--DECLARE
@Input NVARCHAR(MAX),
@Character CHAR(1)
) RETURNS @Output TABLE (Item NVARCHAR(1000))
AS
BEGIN
DECLARE @StartIndex INT, @EndIndex INT
SET @StartIndex = 1
IF SUBSTRING(@Input, LEN(@Input) - 1, LEN(@Input)) <> @Character
BEGIN
SET @Input = @Input + @Character
END
WHILE CHARINDEX(@Character, @Input) > 0
BEGIN
SET @EndIndex = CHARINDEX(@Character, @Input)
INSERT INTO @Output(Item)
SELECT SUBSTRING(@Input, @StartIndex, @EndIndex - 1)
SET @Input = SUBSTRING(@Input, @EndIndex + 1, LEN(@Input))
END
RETURN
END
GO
この関数をサーバー全体で使用できるようにするには、上記のコードを実行します。
は、一度作成次のように、関数は、テーブルが参照されている方法と同じように、クエリで参照することができます。
SELECT
CONVERT(NVARCHAR(MAX), ROW_NUMBER() OVER (ORDER BY Item)) AS EmployeeId,
SUBSTRING(Item, 0, CHARINDEX (',', Item)) AS EmployeeName,
SUBSTRING(Item, CHARINDEX (',', Item) + 1,LEN(Item)) AS EmployeeAddress
FROM
dbo.split('EMPLOYER-NAME,EMPADDRESS;EMPLOYER-NAME,EMPADDRESS;EMPLOYER-NAME,EMPADDRESS', ';') AS Employee
上記のクエリは、きちんとしたテーブル内のデータを表示します。
ベースとして、これを使用して、私は単一NVARCHAR入力パラメータをeccepts、そしてあなたが要求した方法で列が表示され、次の手順、作成:次のように手順が動作する方法がある
CREATE PROCEDURE Employee(
--DECLARE
@Input NVARCHAR(MAX) = 'EMPLOYER-NAME,EMPADDRESS;EMPLOYER-NAME,EMPADDRESS;EMPLOYER-NAME,EMPADDRESS'
) AS
BEGIN
SELECT
CONVERT(NVARCHAR(MAX), ROW_NUMBER() OVER (ORDER BY Item)) AS EmployeeId,
SUBSTRING(Item, 0, CHARINDEX (',', Item)) AS EmployeeName,
SUBSTRING(Item, CHARINDEX (',', Item) + 1,LEN(Item)) AS EmployeeAddress
INTO #Employees
FROM
dbo.split(@Input, ';') AS Employee
SELECT
(SELECT TOP 1 EmployeeName FROM #Employees WHERE EmployeeId = 1) AS EmpName1,
(SELECT TOP 1 EmployeeAddress FROM #Employees WHERE EmployeeId = 1) AS EmpAddress1,
(SELECT TOP 1 EmployeeName FROM #Employees WHERE EmployeeId = 2) AS EmpName2,
(SELECT TOP 1 EmployeeAddress FROM #Employees WHERE EmployeeId = 2) AS EmpAddress2,
(SELECT TOP 1 EmployeeName FROM #Employees WHERE EmployeeId = 3) AS EmpName3,
(SELECT TOP 1 EmployeeAddress FROM #Employees WHERE EmployeeId = 3) AS EmpAddress3,
(SELECT TOP 1 EmployeeName FROM #Employees WHERE EmployeeId = 4) AS EmpName4,
(SELECT TOP 1 EmployeeAddress FROM #Employees WHERE EmployeeId = 4) AS EmpAddress4,
(SELECT TOP 1 EmployeeName FROM #Employees WHERE EmployeeId = 5) AS EmpName5,
(SELECT TOP 1 EmployeeAddress FROM #Employees WHERE EmployeeId = 5) AS EmpAddress5
DROP TABLE #Employees
END
は、 :
- テーブルを#Employeesという名前の一時テーブルに保存します。
- 上位5人の従業員を1つの行として選択します。
- 一時テーブルを削除します。
次のように手順を使用します。
exec Employee 'EMPLOYER-NAME,EMPADDRESS;EMPLOYER-NAME,EMPADDRESS;EMPLOYER-NAME,EMPADDRESS'
あなたが使用しようとしたSQLを共有してください。 –
あなたは何を求めているのかをもっと明確にし、これまでに試したことを示すべきです。 – Jan