如何在MSSQL的存储过程和函数中将列名作为参数发送

如何在MSSQL的存储过程和函数中将列名作为参数发送,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我正在尝试在mssql(sql server)中创建一个存储过程,它采用表名和列名的参数。存储的进程应使用base 64值更新给定的表和列名。我能够在sql server中创建将字符串转换为base64的函数,如下所示 ALTER FUNCTION [dbo].[uFnStrToB64] ( @InputString VARCHAR(MAX) ) RETURNS VARCHAR(MAX) AS BEGIN RETURN ( SELECT C

我正在尝试在mssql(sql server)中创建一个存储过程,它采用表名和列名的参数。存储的进程应使用base 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 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语句移动到存储过程时,为什么相同的
update
语句将
mycolumn
作为字符串而不是从列中获取值?我愿意更改函数和存储过程,或者不使用函数在存储过程中进行base 64转换。

多亏了@dan,以下是解决方案

SET @SQL = N' UPDATE ' + QUOTENAME(@tbl) 
+ N' SET ' + QUOTENAME(@Name) 
+ N' = dbo.uFnStrToB64(' + QUOTENAME(@Name) 
+ N');';

我想您需要
SET@SQL=N'UPDATE'+QUOTENAME(@tbl)+N'SET'+QUOTENAME(@Name)+N'=dbo.uFnStrToB64('+QUOTENAME(@Name)+N')确定。让我试试,然后再打给你。Thanks@DanGuzman工作很有魅力!非常感谢。