存储过程没有 return 列中的值
Stored procedure does not return value in column
我有这个问题。我有这个查询,我曾在其中对存储过程建模,我想获取列 clr_bal_amt
中的值。我希望它 return 作为数据库列中的字符串。
然而它没有 return 它。查询执行,但未获取该列中的值。
存储过程如下所示
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
我需要某种形式的澄清。为什么这不是 return 那个 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;
Edits2
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''' ...'
有点无耻的自我推销,我更深入地解释这个场景here。
为了强调 OP 试图实现这一点,您的尝试不一样:
N'... N' + REPLACE(@query, '''','''''') + N' ...'
请注意缺少尾随和前导单引号 ('
)。单引号 需要 。 REPLACE
替换 个字符,它不像 QUOTENAME
那样分隔标识它们。
我有这个问题。我有这个查询,我曾在其中对存储过程建模,我想获取列 clr_bal_amt
中的值。我希望它 return 作为数据库列中的字符串。
然而它没有 return 它。查询执行,但未获取该列中的值。 存储过程如下所示
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
我需要某种形式的澄清。为什么这不是 return 那个 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;
Edits2
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''' ...'
有点无耻的自我推销,我更深入地解释这个场景here。
为了强调 OP 试图实现这一点,您的尝试不一样:
N'... N' + REPLACE(@query, '''','''''') + N' ...'
请注意缺少尾随和前导单引号 ('
)。单引号 需要 。 REPLACE
替换 个字符,它不像 QUOTENAME
那样分隔标识它们。