2017-10-31 4 views
-3

私は列を持つSQL Server 2012の内のテーブルを持っているとのデータの行を選択する方法:データ以下含まれていることを複数の区切り文字

EMPLOYER-NAME,EMPADDRESS;EMPLOYER-NAME,EMPADDRESS;EMPLOYER-NAME,EMPADDRESS 

はセミコロンが5まで、雇用者を分離し、そしてカンマを分離EmployerNameと雇用者の住所。

私は次のように行とディスプレイを選択する必要があります。

EMPNAME1 EMPADDRESS1 EMPNAME2 EMPADDRESS2 EMPNAME3 EMPADDRESS3..... 
+0

あなたが使用しようとしたSQLを共有してください。 –

+0

あなたは何を求めているのかをもっと明確にし、これまでに試したことを示すべきです。 – Jan

答えて

0

基本的に私はあなたの必要性をスイート特定splitstring関数を記述し、そのソーステーブルの上の選択でそれを使用します。 CHARINDEX()とSUBSTRING()を見てください。ここですぐに明確なものを作ることができる例をつかんで:T-SQL split string とTSQL機能書き方に関する詳細情報:問題の https://docs.microsoft.com/en-us/sql/t-sql/statements/create-function-transact-sql

無記号、答えではありませんコード、それが=に役立ちます願っています)

+0

午後1月私は最初にそれを理解しませんでしたが、私の答えはあなたの答えの延長線上にあると感じます。私のコードをあなたの答えに追加したいですか?私に知らせてください –

+0

絶対に!あなたの答えは私のものよりもはるかに多くの努力を払っていたので、もしあれがあれば、 "栄冠を収穫する"べきです。 =) – Jan

0

を次のコードで分割関数を作成できます。

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' 
関連する問題