![](/img/trans.png)
[英]entity framework 4 function imports stored proc complex type return no column
[英]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.