Я пытаюсь создать хранимую процедуру в mssql (sql server), которая принимает параметры имени таблицы и имени столбца. Хранимая процедура должна обновить данную таблицу и имя столбца со значением base 64. Мне удалось создать функцию для преобразования строки в base64 в SQL Server, который выглядит следующим образом,
ALTER FUNCTION [dbo].[uFnStrToB64]
(
@InputString VARCHAR(MAX)
)
RETURNS VARCHAR(MAX)
AS
BEGIN
RETURN (
SELECT
CAST(N'' AS XML).value(
'xs:base64Binary(xs:hexBinary(sql:column("bin")))'
, 'VARCHAR(MAX)'
)
FROM (
SELECT CAST(@InputString AS VARBINARY(MAX)) AS bin
) AS RetVal
)
END;
Теперь я вызываю эту функцию в следующей хранимой процедуре, как показано ниже
ALTER PROCEDURE [dbo].[UpdateTableColumnWithB64]
@tbl sysname,
@Name sysname
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = N' UPDATE ' + QUOTENAME(@tbl)
+ N' SET ' + @Name + ' = ' + dbo.uFnStrToB64(@Name)
EXECUTE sp_executesql @SQL
END
Но вместо того, чтобы обновить значение столбца основанием 64 значения столбца, оно заменяет его основанием 64 имени столбца. Но когда я запускаю следующую команду обновления, она работает без сбоев,
UPDATE mytable SET mycolumn=dbo.uFnStrToB64(mycolumn)
Я вызываю хранимую процедуру следующим образом,
DECLARE @return_value int
EXEC @return_value = [dbo].[UpdateTableColumnWithB64]
@tbl = mytable,
@Name = mycolumn
SELECT 'Return Value' = @return_value
GO
Добавление команд создания и вставки таблиц, если кто-то хочет их запустить и попробовать,
CREATE TABLE mytable(
mycolumn varchar(max) NULL
);
INSERT INTO mytable(mycolumn) VALUES ('test'), ('test2'), ('test3');
Может ли кто-нибудь помочь мне понять, когда я перемещаю оператор обновления в хранимую процедуру, почему тот же оператор update
принимает mycolumn
в виде строки вместо получения значения из столбца? Я открыт для изменения функции и хранимого процесса или открыт для способов преобразования базы 64 в хранимый процесс без использования функции.