sql—在给定rowindex时返回带有值的表结构的函数

kfgdxczn  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(326)

我正在尝试创建一个函数/storedprocedure,无论何时使用params tablename和index调用它。它将返回如下字符串:

id=2, detail=car repair, concluded=1, bill=No, applicant=others, fk_boxId=1

最简单的方法是:

select Concat('id=', id, ', detail=', detail, ', concluded=', concluded, ', bill=', bill, ', applicant=', applicant, ', fk_boxId=' ,fk_boxId)
  FROM [CashBox].[dbo].[Concepts]
  where id = 2

但我希望能够发送任何表,而不必每次添加列时都修改函数。
我不知道是否已经有一个函数或库已经这样做了。我寻找它没有运气。
说这话。我开始自己编写函数。但我有点卡住了。这就是我的想法。。。
功能:

CREATE FUNCTION [dbo].[getColumnValue](@tableName varchar(255), @column varchar(255), @rowIndex int)
    RETURNS VARCHAR(255)
AS
BEGIN
    DECLARE @ret VARCHAR(255)   
    DECLARE @primaryKey NVARCHAR(255) = (SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tableName)
    DECLARE @SQL NVARCHAR(4000) = N'SELECT @column FROM @tableName WHERE @primaryKey=@rowIndex'

    DECLARE @PARAMS NVARCHAR(500);  
    SET @PARAMS = N'@column varchar(255), @tableName varchar(255), @primaryKey varchar(255), @rowIndex int, @ret varchar(255) OUTPUT';  

    exec sp_executesql @SQL, @PARAMS, @column, @primaryKey, @rowIndex, @tableName, @ret output;
    RETURN @ret
END

电话:

--PARAMS FOR TESTING
DECLARE @rowIndex varchar(500) = '1'
DECLARE @tableName varchar(500) = 'Concepts'
DECLARE @result varchar(500) = ''

SELECT @result = @result + COLUMN_NAME + '=' + dbo.getColumnValue(@tableName, COLUMN_NAME, @rowIndex) + ', '
FROM INFORMATION_SCHEMA.COLUMNS  
WHERE TABLE_NAME = @tableName

SELECT  @result

错误消息:(这发生在函数内部)

Must declare the table variable "@tableName".

即使我尝试用硬编码的变量运行函数,结果也是空的,我也害怕我没有正确调用sp\u executesql func,或者查询有我看不到的逻辑问题。我不明白我想做什么。
提前谢谢。这是我第一次提出一个问题,我尽量把问题说清楚。

68bkxrlz

68bkxrlz1#

您是否考虑过将xml或json用于行集合?
例子

select RowDetailsXML  = (Select A.* for XML RAW)
      ,RowDetailsJSON = (Select A.* For JSON Path,Without_Array_Wrapper )
  FROM [CashBox].[dbo].[Concepts] A
  where id = 2

相关问题