Как отправить имя столбца в качестве параметра в хранимой процедуре и функции в MSSQL - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь создать хранимую процедуру в 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 в хранимый процесс без использования функции.

1 Ответ

1 голос
/ 08 апреля 2019

Благодаря @dan, вот решение

SET @SQL = N' UPDATE ' + QUOTENAME(@tbl) 
+ N' SET ' + QUOTENAME(@Name) 
+ N' = dbo.uFnStrToB64(' + QUOTENAME(@Name) 
+ N');';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...