2016-09-04 11 views
1

動的な挿入クエリをストアドプロシージャに記述しています。ストアドプロシージャのパラメータとして列名を受け取っています。動的SQL Serverクエリ

例えば、私はEmployeeIdEmployeeNameの列を持つEmployeeテーブルを持っています。 EmployeeテーブルからDepartmentテーブルにデータを挿入する際に、各従業員名の前にEMP_を追加する必要があります。

非動的クエリは次のようになります。私は、動的挿入

SET @SqlCommand = 
      'INSERT INTO ' + @DepartmentTable + '(' + @EmployeeIdColumn + ',' + @EmployeeNameColumn + ')' + 
      'SELECT ' + @EmployeeIdColumn + ',''EMP_''' + @EmployeeNameColumn + '''' +  
      'FROM ' + 
       @EmployeeTable + ' WTB ' 

     EXEC sp_executesql 
     @stmt  = @SqlCommand 

を書く場合

INSERT INTO Department(EmployeeId, EmployeeName) 
    SELECT 
     EmployeeId, 'EMP_' + EmployeeName 
    FROM 
     Employee 

問題は、EmployeeName列のために、それは「EMP_EmployeeName」の代わりに、実際の従業員名を挿入されています。私はEmployeeNameColumnの前後に引用符を入れてみましたが、うまくいきませんでした。どうすれば修正できますか?

+1

APPEND「EMP」を各従業員名の前には列が「従業員名」のような名前にスペースを持っている状況を回避するのに役立ちます。 @EmployeeNameColumnは、ストアドプロシージャが受け取る列名です。 – turbo88

+0

これはあらかじめ回答していませんが、このブログ記事を読むことを強くお勧めします。私はいつでも動的SQLをやっています。これは、安全な(パラメータ化された)動的SQLと効率的なhttp://www.sommarskog.se/dynamic_sql.html#good_practicesの両方を達成するための "ベストプラクティス"の方法を詳細に示しています。 – bUKaneer

+0

@ turbo88 hey!あなたは解決策を試しましたか? – gofr1

答えて

0

EMP_''の後に+を1つだけ入力し、' WTB 'の後に削除します。あなたはこのような何かを得るでしょうPRINT @SqlCommand場合

SET @SqlCommand = 
'INSERT INTO ' + @DepartmentTable + ' (' + @EmployeeIdColumn + ',' + @EmployeeNameColumn + ')' + 
' SELECT ' + @EmployeeIdColumn + ',''EMP_''+' + @EmployeeNameColumn +  
' FROM ' + @EmployeeTable + ' WTB ' 

INSERT INTO Department (EmpId,EmpName) SELECT EmpId,'EMP_'+EmpName FROM Employee WTB 

そして、もう一つのノートには:より良いテーブル/列名とQUOTENAMEを使用する。また、私はいくつかのスペースを修正しました。取得するには

SET @SqlCommand = 
'INSERT INTO ' + QUOTENAME(@DepartmentTable) + '(' + QUOTENAME(@EmployeeIdColumn) + ',' + QUOTENAME(@EmployeeNameColumn) + ')'+ 
' SELECT ' + QUOTENAME(@EmployeeIdColumn) + ',''EMP_''+' + QUOTENAME(@EmployeeNameColumn) + 
' FROM ' + QUOTENAME(@EmployeeTable) + ' WTB ' 

INSERT INTO [Department]([EmpId],[EmpName]) SELECT [EmpId],'EMP_'+[EmpName] FROM [Employee] WTB 
0

CONCAT機能を使用してみてください。

-- Syntax for SQL Server, Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse 

CONCAT (string_value1, string_value2 [, string_valueN ]) 

あなたのクエリは次のようになります。

INSERT INTO deptTable(empId,empName) 
SELECT empId,concat('EMP_', empName) as empName FROM empTable 

PS:私はあなたの質問を誤解したように見えます。

INSERT INTO deptTable(empId,empName) 
SELECT empId,'SUFFIX'+empName as empName FROM empTable 

でも動作します。私はあなたがストアドプロシージャのためにそれを望んだと思います。

いずれにしても、concatはそれを実行する必要があります。