繁体   English   中英

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

[英]How to send column name as param in stored proc and function in MSSQL

我正在尝试在mssql(SQL Server)中创建一个存储过程,该存储过程采用表名和列名的参数。 存储的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)

我叫存储过程如下

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作为字符串而不是从列中获取值吗? 我愿意更改功能和存储的proc或愿意在不使用函数的情况下在存储的proc中进行base 64转换。

感谢@dan,以下是解决方案

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM