2015-02-25 4 views
0

Мне было интересно, можно ли передать имя столбца таблицы, чтобы я мог создать динамический запрос для моей хранимой процедуры. Буду признателен за любую помощь!Динамически передать имя столбца в SQL-запрос

Хороший запрос:

SELECT 
A1, 
LEFT (A1,CHARINDEX(',',A1)-1) AS UPC, 
SUBSTRING(A1,CHARINDEX(',', A1 , 1) + 1,LEN(A1) - CHARINDEX(',', A1) - CHARINDEX(',', REVERSE(A1))) AS Date, 
SUBSTRING(A1,CHARINDEX(',', A1 , 1) + 7,LEN(A1) - CHARINDEX(',', A1) - CHARINDEX(',', REVERSE(A1))) AS Qty 
FROM Registry Where Id=26 

Выход:

A1    UPC  Date Qty 
------------------------------------- 
CPU1,01/15,3  CPU1  01/15 3 

Это то, что я до сих пор для хранимой процедуры

SP:

ALTER PROCEDURE [dbo].[SP_UPD_Compartment] 
@Id int, 
@Col_Name char(40) 

AS 
BEGIN 
SET NOCOUNT ON; 

SELECT 
@Col_Name, 
LEFT (@Col_Name,CHARINDEX(',',@Col_Name)-1) AS UPC, 
SUBSTRING(@Col_Name,CHARINDEX(',', @Col_Name , 1) + 1,LEN(@Col_Name) - CHARINDEX(',', @Col_Name) - CHARINDEX(',', REVERSE(@Col_Name))) AS Date, 
SUBSTRING(@Col_Name,CHARINDEX(',', @Col_Name , 1) + 7,LEN(@Col_Name) - CHARINDEX(',', @Col_Name) - CHARINDEX(',', REVERSE(@Col_Name))) AS Qty 
FROM Registry Where [email protected] 

END 

Ошибка сбщ:

Msg 537, Level 16, State 2, Procedure SP_UPD_Compartment, Line 9 
Invalid length parameter passed to the LEFT or SUBSTRING function. 
+0

Читайте немного о sp_executesql –

ответ

1

Я печатаю на вкладке, поэтому могут возникнуть некоторые синтаксические ошибки, но я думаю, что вы получите эту идею. Сначала вы создаете строку с вашим оператором, а затем заменяете подстроку '@Col_Name' переданным параметром на процедуру. Затем вы выполняете этот динамический sql. Вы также можете добавить Print @cmd до EXEC(@cmd), чтобы увидеть, что на самом деле будет выполнено.

ALTER PROCEDURE [dbo].[SP_UPD_Compartment] 
@Id INT, 
@Col_Name CHAR(40) 

AS 
BEGIN 
SET NOCOUNT ON; 

DECLARE @cmd NVARCHAR(4000) = 
'SELECT 
@Col_Name, 
LEFT (@Col_Name,CHARINDEX('','',@Col_Name)-1) AS UPC, 
SUBSTRING(@Col_Name,CHARINDEX('','', @Col_Name , 1) + 1,LEN(@Col_Name) - CHARINDEX('','', @Col_Name) - CHARINDEX('','', REVERSE(@Col_Name))) AS Date, 
SUBSTRING(@Col_Name,CHARINDEX('','', @Col_Name , 1) + 7,LEN(@Col_Name) - CHARINDEX('','', @Col_Name) - CHARINDEX('','', REVERSE(@Col_Name))) AS Qty 
FROM Registry WHERE Id=' + CAST(@Id AS NVARCHAR(20)) 

SET @cmd = REPLACE(@cmd, '@Col_Name', @Col_Name) 
EXEC(@cmd) 

END 
+0

@Carlos, вы можете написать непосредственно ' 'Обновление реестра Set @Col_Name = LEFT (@ COL_NAME, CHARINDEX ('», '', @ COL_NAME) -1) + '', '' + LEFT (@ Col_Name, CHARINDEX ('', '', @ Col_Name) -1) ''. Теперь вам не нужна замена для запятой. –

Смежные вопросы