简体   繁体   English

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

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

I'm trying to create a stored procedure in mssql (sql server) which takes the params of table name and column name. 我正在尝试在mssql(SQL Server)中创建一个存储过程,该存储过程采用表名和列名的参数。 The stored proc should update given table and column name with base 64 value. 存储的proc应该使用基数64的值更新给定的表和列名称。 I was able to create the function to convert string to base64 in sql server, which is a follows, 我能够在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;

Now, I'm calling this function in following stored procedure, as follows 现在,我在以下存储过程中调用此函数,如下所示

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

But instead of updating the column value with base 64 of the column value, it is replacing it with base 64 of column name. 但是,不是用列值的基数64更新列值,而是用列名的基数64替换列值。 But when I run following update command, it works flawlessly, 但是,当我运行以下update命令时,它可以正常工作,

UPDATE mytable SET mycolumn=dbo.uFnStrToB64(mycolumn)

I'm calling stored proc as follows, 我叫存储过程如下

DECLARE @return_value int

EXEC    @return_value = [dbo].[UpdateTableColumnWithB64]
        @tbl = mytable,
        @Name = mycolumn

SELECT  'Return Value' = @return_value

GO

Adding create and insert table commands, if someone wants to run it and try it, 添加创建和插入表命令,如果有人想运行它并尝试使用它,

CREATE TABLE mytable(
    mycolumn varchar(max) NULL
);

INSERT INTO mytable(mycolumn) VALUES ('test'), ('test2'), ('test3');

Can somebody help me understand, when I move the update statement to stored procedure why the same update statement takes mycolumn as string instead of getting value from column? 当我将更新语句移至存储过程时,有人可以帮助我理解为什么同一update语句将mycolumn作为字符串而不是从列中获取值吗? I'm open to change function and stored proc Or open for ways to do base 64 conversion in stored proc without usage of function. 我愿意更改功能和存储的proc或愿意在不使用函数的情况下在存储的proc中进行base 64转换。

Thanks to @dan, following is the solution 感谢@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