Reputation: 97
I have a stored procedure where I want to add a column name as a parameter. The procedure updates some columns like this.
UPDATE Reservedele
SET Bemærkning = @Bemærkning
,Art = @Art
,Type = @Type
,Lev = @Lev
,@stockNumber = @stockCount
WHERE Varenummer = @Varenummer
I want to update a column named as stock1 as I pass in as @StockNumber, but all it does is setting @stockNumber equal to @Varenummer. (Which probably what I am telling it to do).
How can I do this?
I am new to SQL and I need to read up on dynamic SQL.
My full code looks like this, but the update statement is not doing anything.
ALTER PROCEDURE [dbo].[updateItemsInSqlNoImage]
@Bemærkning nvarchar(200),
@Varenummer nchar(20),
@Art nvarchar(50),
@Type nvarchar(50),
@Lev nvarchar(50),
@Bruger nvarchar(50),
@Dato nvarchar(50),
@Tid nvarchar(50),
@Ip nvarchar(50),
@stockCount int,
@stockNumber varchar(10)
as
BEGIN
DECLARE @SQL nvarchar(MAX),
@CRLF nchar(2) = NCHAR(13) + NCHAR(10);
SET @SQL = N'UPDATE Reservedele' + @CRLF+
N',Bemærkning=@Bemærkning'+ @CRLF+
N',Art=@Art' + @CRLF+
N',Type=@Type' + @CRLF+
N',Lev=@Lev'+ @CRLF+
N' ,' + QUOTENAME(@stockNumber) + N' = @stockCount' + @CRLF +
N'WHERE Varenummer=@Varenummer;';
INSERT INTO Ændrede_dele(Varenummer,Dato,Tid,Bruger,Ip)
VALUES (@Varenummer,@Dato,@Tid,@Bruger,@stockNumber)
END
Upvotes: 0
Views: 229
Reputation: 95534
That isn't how SQL works, it isn't a scripting language, it's a query language. A variable cannot be used to replace a something that needs to be a literal value. @stockNumber
is being seen as the parameter @stockNumber
, not the value of the parameter, @stockNumber
. As a result it makes it look like you have a SET
operation that is part of an UPDATE
but also trying to assign the value of variables/parameters (which you can't do).
You would need to use dynamic SQL to achieve this:
--All data types are guessed, replace appropriately
CREATE PROC dbo.YourProc @Bemærkning varchar(10),
@Art int,
@Type int,
@Lev decimal(6,2),
@stockNumber sysname, --apart from this one, this is correct
@stockCount int,
@Varenummer varchar(25) AS
BEGIN
DECLARE @SQL nvarchar(MAX),
@CRLF nchar(2) = NCHAR(13) + NCHAR(10);
SET @SQL = N'UPDATE Reservedele' + @CRLF +
N'SET Bemærkning = @Bemærkning' + @CRLF +
N' ,Art = @Art' + @CRLF +
N' ,Type = @Type' + @CRLF +
N' ,Lev = @Lev' + @CRLF +
N' ,' + QUOTENAME(@stockNumber) + N' = @stockCount' + @CRLF +
N'WHERE Varenummer = @Varenummer;';
--PRINT @SQL; --Your debugging friend
--Again, all data types are guessed, replace appropriately
EXEC sys.sp_executesql @SQL, N'@Bemærkning varchar(10), @Art int, @Type int, @Lev decimal(6,2), @stockCount int, @Varenummer varchar(25)', @Bemærkning, @Art, @Type, @Lev, @stockCount, @Varenummer;
END;
Upvotes: 7