存储过程不返回列中的值

时间:2021-07-18 10:12:21

标签: sql sql-server stored-procedures

我有这个问题。我有一个用于对存储过程建模的查询,我想获取列 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;

有什么我遗漏的吗?

1 个答案:

答案 0 :(得分:0)

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

只需使用REPLACE

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

作为一种无耻的自我宣传,我更深入地解释了这个场景here


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

<块引用>
N'... N' + REPLACE(@query, '''','''''') + N' ...'

注意缺少尾随和前导单引号 (')。 需要单引号。 REPLACE 替换 个字符,它不像 QUOTENAME 那样分隔标识。

相关问题