我正在尝试在mssql(SQL服务器)中创建一个存储过程,该存储过程采用表名和列名的参数。存储的proc应该使用基数64的值更新给定的表和列名称。我能够在SQL Server中创建将字符串转换为base64的函数,如下所示,
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命令时,它运行正常,
UPDATE mytable SET mycolumn=dbo.uFnStrToB64(mycolumn)
我正在按如下方式调用存储的proc
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语句移至存储过程时,为什么有人可以帮我理解为什么同一个update
语句将mycolumn
作为字符串而不是从列中获取值?我愿意更改功能和存储的proc,或者愿意在不使用函数的情况下在存储的proc中进行base 64转换。
答案 0 :(得分:1)
感谢@dan,以下是解决方法
SET @SQL = N' UPDATE ' + QUOTENAME(@tbl)
+ N' SET ' + QUOTENAME(@Name)
+ N' = dbo.uFnStrToB64(' + QUOTENAME(@Name)
+ N');';