2016-09-04 12 views
1

Ich schreibe eine dynamische Einfügeabfrage in einer gespeicherten Prozedur. Ich erhalte die Spaltennamen als Parameter für meine gespeicherte Prozedur.Dynamische SQL Server-Abfrage

Zum Beispiel habe ich eine Employee Tabelle mit EmployeeId und EmployeeName Spalten. Ich muss EMP_ vor jedem Angestelltennamen beim Einfügen der Daten in Department Tabelle von Employee Tabelle anfügen.

Nicht dynamische Abfrage sieht so aus.

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

Wenn ich schreibe einen dynamischen Einsatz

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

     EXEC sp_executesql 
     @stmt  = @SqlCommand 

Die Frage ist, für die EmployeeName Spalt, wird „EMP_EmployeeName“ anstelle der tatsächlichen Mitarbeiternamen einfügen. Ich habe versucht, Zitate vor und nach EmployeeNameColumn, aber es hat nicht funktioniert. Wie kann ich es reparieren?

+1

append „EMP“ vor jedem Mitarbeiternamen. @EmployeeNameColumn ist der Spaltenname, den der gespeicherte Proc erhält. – turbo88

+0

Während dies nicht ist und Antwort vor, würde ich Ihnen dringend empfehlen, diesen Blog-Post zu lesen. Ich beziehe mich immer wieder darauf, wenn ich dynamische SQL mache. Es beschreibt viele "Best Practice" -Methoden, um dynamische SQL zu erreichen, die sowohl sicher (parametrisiert) als auch effizient sind. Http://www.sommarskog.se/dynamic_sql.html#good_practices – bUKaneer

+0

@ turbo88 hey! Haben Sie eine der angebotenen Lösungen ausprobiert? – gofr1

Antwort

0

Sie benötigen nur eine + nach EMP_'', und entfernen Sie sie nach ' WTB '. Auch in fixer ich einige Räume:

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

Wenn Sie PRINT @SqlCommand Sie so etwas wie diese bekommen:

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

Und noch eine Anmerkung: besser QUOTENAME mit Tabelle/Spaltennamen verwenden. Es wird helfen, Situationen zu vermeiden, in denen Spalte Leerzeichen im Namen wie ‚Mitarbeitername‘ hat:

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

Um:

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

Verwenden Sie die CONCAT-Funktion.

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

CONCAT (string_value1, string_value2 [, string_valueN ]) 

Ihre Anfrage würde dann wie folgt aussehen:

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

PS: Sieht aus wie ich Ihre Frage falsch verstanden.

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

wird auch funktionieren. Ich nehme an, du wolltest es für den gespeicherten Proc.

In jedem Fall sollte die concat immer noch tun.