存储过程不在列中返回值



我有这个问题。我有一个查询,我曾在其中对存储过程进行建模,我想在列clr_bal_amt中获得值。我希望它以字符串的形式从数据库列返回。

但是它不返回它。查询执行,但没有得到该列中的值。存储过程看起来像这个

CREATE PROCEDURE FindBranchVaultBalance
@sol_id varchar(50),
@acct_crncy_code varchar(50)
AS
DECLARE @query nvarchar(max) = N'
select foracid, acct_crncy_code, clr_bal_amt 
from dummy_table  
where bacid = ''1010000001'' and sol_id = ' + QUOTENAME(@sol_id, '''') + N' and
acct_crncy_code = ' + QUOTENAME(@acct_crncy_code, '''') + N' and
del_flg = ''N'' and acct_cls_flg = ''N''
';
DECLARE @sql nvarchar(max) = N'
SELECT * 
FROM OPENQUERY (LINKEDSERVER, N' + QUOTENAME(@query, '''') + N'  )
';
EXEC sp_executesql @sql;
GO

我需要某种形式的澄清。为什么它没有在clr_bal_amt列中返回该值?

已编辑

SQL现在是这样的

ALTER PROCEDURE [dbo].[FindBranchVaultBalance]
@sol_id varchar(50),
@acct_crncy_code varchar(50)
AS
DECLARE @query nvarchar(max) = N'
select foracid, acct_crncy_code, clr_bal_amt 
from dummy_table  
where bacid = ''1010000001'' and sol_id = ' + QUOTENAME(@sol_id, '''') + N' and
acct_crncy_code = ' + QUOTENAME(@acct_crncy_code, '''') + N' and
del_flg = ''N'' and acct_cls_flg = ''N''
';
DECLARE @sql nvarchar(max) = N'
SELECT * 
FROM OPENQUERY (LINKEDSERVER, N' + REPLACE(@query, '''','''''') + N'  )
';
EXEC sp_executesql @sql;

编辑2

ALTER PROCEDURE [dbo].[FindAFINACLEBranchVaultBalance]
@sol_id varchar(50),
@acct_crncy_code varchar(50)
AS
DECLARE @query nvarchar(max) = N'
select foracid, acct_crncy_code, clr_bal_amt 
from dummy_table
where bacid = ''1010000001'' and sol_id = ' + QUOTENAME(@sol_id, '''') + N' and
acct_crncy_code = ' + QUOTENAME(@acct_crncy_code, '''') + N' and
del_flg = ''N'' and acct_cls_flg = ''N''
';
DECLARE @sql nvarchar(max) = N'
SELECT * 
FROM OPENQUERY (LINKEDSERVER, N' + '... N''' + REPLACE(@query, '''','''''') + N''' ...'+ N'  )
';
EXEC sp_executesql @sql;

我有什么东西不见了吗?

正如我所提到的,QUOTENAME接受sysname作为参数(nvarchar(128) NOT NULL的同义词(,并且您的变量@query被定义为nvarchar(MAX)。因此,如果它的长度为129个或更多个字符,它将被截断;您的值显然超过128个字符。

只需使用REPLACE:

N'... N''' + REPLACE(@query, '''','''''') + N''' ...'

作为一种无耻的自我推销,我在这里更深入地解释了这种情况。


为了强调OP实现这一点的尝试,您的尝试不同:

N'... N' + REPLACE(@query, '''','''''') + N' ...'

请注意缺少尾随和前导单引号('(。需要单引号REPLACE替换字符,它不像QUOTENAME那样对它们进行定界标识。

最新更新