簡體   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