【问题标题】:SQL Server Dynamic Query ErrorSQL Server 动态查询错误
【发布时间】:2017-11-29 18:45:42
【问题描述】:

需要您帮助找出我使用动态 SQL 查询的错误。 下面是我的示例查询,但我无法检测到我的错误在哪里。

DECLARE @p_orgcompreq NVARCHAR(10)='1.1' 
DECLARE @table_name NVARCHAR(50)='test' 
DECLARE @treelevel INT 
DECLARE @OrgCompCode_Parent NVARCHAR(10)='1.1' 
DECLARE @OrgCompCode_Child NVARCHAR(10)='1.1.1' 
DECLARE @SQLQuery NVARCHAR(max) 

SELECT @treelevel = @@NESTLEVEL - 1 

SET @SQLQuery = 'insert into ' + @table_name 
                + 
' (level,OrgCompCode_Parent,OrgCompCode_Child) values (replicate(CHAR(45), ' 
                + Ltrim(Str(@treelevel)) 
                + ' * 1)          + ltrim(str(' 
                + Ltrim(Str(@treelevel)) + ')),''' + ( @OrgCompCode_Parent ) + 
                ''',''' + 
                                @OrgCompCode_Child + ')' 

EXEC (@SQLQuery) 

SELECT @SQLQuery 

以下是引发的错误。希望有人可以帮助我。谢谢。

Msg 105, Level 15, State 1, Line 2 字符串'1.1.1)'。消息 102,第 15 级,状态 1,第 2 行 '1.1.1)' 附近的语法不正确。
(1 行受影响)

【问题讨论】:

    标签: sql sql-server dynamic


    【解决方案1】:

    您可以通过运行 Print 来检查这一点

    DECLARE @p_orgcompreq NVARCHAR(10)='1.1' 
    DECLARE @table_name NVARCHAR(50)='test' 
    DECLARE @treelevel INT 
    DECLARE @OrgCompCode_Parent NVARCHAR(10)='1.1' 
    DECLARE @OrgCompCode_Child NVARCHAR(10)='1.1.1' 
    DECLARE @SQLQuery NVARCHAR(max) 
    
    SELECT @treelevel = @@NESTLEVEL - 1 
    
    SET @SQLQuery = 'insert into ' + @table_name 
                    + 
    ' (level,OrgCompCode_Parent,OrgCompCode_Child) values (replicate(CHAR(45), ' 
                    + Ltrim(Str(@treelevel)) 
                    + ' * 1)          + ltrim(str(' 
                    + Ltrim(Str(@treelevel)) + ')),''' + ( @OrgCompCode_Parent ) + 
                    ''',''' + 
                                    @OrgCompCode_Child + ')' 
    
    Print @SQLQuery
    

    这将显示以下消息:

    insert into test (level,OrgCompCode_Parent,OrgCompCode_Child) values (replicate(CHAR(45), -1 * 1)          + ltrim(str(-1)),'1.1','1.1.1)
    

    编辑

    查看错误,这是错误为 @OrgCompCode_Child + ')' 的部分,因此以下内容应该可以解决此问题:

    DECLARE @p_orgcompreq NVARCHAR(10)='1.1' 
    DECLARE @table_name NVARCHAR(50)='test' 
    DECLARE @treelevel INT 
    DECLARE @OrgCompCode_Parent NVARCHAR(10)='1.1' 
    DECLARE @OrgCompCode_Child NVARCHAR(10)='1.1.1'''
    DECLARE @SQLQuery NVARCHAR(max) 
    
    SELECT @treelevel = @@NESTLEVEL - 1 
    
    SET @SQLQuery = 'insert into ' + @table_name 
                    + 
    ' (level,OrgCompCode_Parent,OrgCompCode_Child) values (replicate(CHAR(45), ' 
                    + Ltrim(Str(@treelevel)) 
                    + ' * 1)        + ltrim(str(' 
                    + Ltrim(Str(@treelevel)) + ')),''' + ( @OrgCompCode_Parent ) + 
                    ''',''' + 
                                    @OrgCompCode_Child + ')'
    

    DECLARE @p_orgcompreq NVARCHAR(10)='1.1' 
    DECLARE @table_name NVARCHAR(50)='test' 
    DECLARE @treelevel INT 
    DECLARE @OrgCompCode_Parent NVARCHAR(10)='1.1' 
    DECLARE @OrgCompCode_Child NVARCHAR(10)='1.1.1'
    DECLARE @SQLQuery NVARCHAR(max) 
    
    SELECT @treelevel = @@NESTLEVEL - 1 
    
    SET @SQLQuery = 'insert into ' + @table_name 
                    + 
    ' (level,OrgCompCode_Parent,OrgCompCode_Child) values (replicate(CHAR(45), ' 
                    + Ltrim(Str(@treelevel)) 
                    + ' * 1)        + ltrim(str(' 
                    + Ltrim(Str(@treelevel)) + ')),''' + ( @OrgCompCode_Parent ) + 
                    ''',''' + 
                                    @OrgCompCode_Child +''''  + ')'
    
    print @SQLQuery
    EXEC (@SQLQuery) 
    
    SELECT @SQLQuery 
    

    【讨论】:

    • 这不是答案。
    • @Tom : 非常感谢 Tom,这太完美了。
    • @EliseoJr,别担心 :)
    • @EliseoJr,如果您对此解决方案感到满意,请将其标记为答案吗?谢谢你:)
    • @Tom,如何将此标记为答案?抱歉,我不知道该怎么做。
    猜你喜欢
    • 2010-09-20
    • 2017-01-11
    • 2015-04-22
    • 1970-01-01
    • 2012-05-11
    相关资源
    最近更新 更多