【问题标题】:SQL - query as parameterSQL - 查询作为参数
【发布时间】:2017-01-04 08:59:36
【问题描述】:

我有代码:

DECLARE @sqlQuery NVARCHAR(4000);
DECLARE @stn NVARCHAR(4000);
SET @stn=N'SELECT cast(isnull(SUBSTRING(CDN.DokSumT(16,739684,1045,1,32768,1,1,739684,1,2,1,0,78877,0,3,1,1,0,0,0,0,0,-1) , 9 , 7 ),0) as decimal (28,4))';
SELECT @sqlQuery = 'SELECT GIDNumber, Name, @stn as stn FROM Table_342 WHERE Name LIKE ''%ABLE%''';
EXEC sp_executesql @sqlQuery, N'@stn NVARCHAR(4000)', @stn;

此请求返回

在“stn”列中,我想要查询结果而不是查询。 怎么做 ?请帮忙。

【问题讨论】:

  • 我不得不问,虽然我怀疑答案是“是”和“不知道” - 这是绝对解决您遇到的问题的最有效方法吗?谁设计了这个数据库?
  • 我不知道,但我想是的:)

标签: sql sql-server tsql sp-executesql


【解决方案1】:

试试这样的……

DECLARE @sqlQuery   NVARCHAR(MAX) 
      , @stn        NVARCHAR(MAX)
      , @stn_R  DECIMAL(28,4);

SET @stn = N'SELECT @stn_R = cast(isnull(SUBSTRING(CDN.DokSumT(16,739684,1045,1,32768,1,1,739684,1,2,1,0,78877,0,3,1,1,0,0,0,0,0,-1) , 9 , 7 ),0) as decimal (28,4))';

EXEC sp_executesql @stn 
                 , N'@stn_R DECIMAL(28,4) OUTPUT' 
                 , @stn_R OUTPUT

SELECT @sqlQuery = 'SELECT GIDNumber, Name, @stn_R as stn FROM Table_342 WHERE Name LIKE ''%ABLE%''';

EXEC sp_executesql @sqlQuery
                 , N'@stn_R DECIMAL(28,4)'
                 , @stn_R;

注意

您的整个查询被视为参数,因为sp_executesql 只有第一个参数需要 SQL 语句,任何后续参数要么是变量声明,要么是变量值。

您需要将动态查询的执行分成两部分,并使用输出参数从第一个查询中获取值并将其传递给第二个查询。

【讨论】:

  • 我有这个错误 Msg 137, Level 15, State 2, Line 1 必须声明标量变量“@stan”。
【解决方案2】:

首先尝试非动态方式。一旦你得到..使用 EXEC(@sqlquery) 动态执行

【讨论】:

    猜你喜欢
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多