【问题标题】:Got error Msg 208 while merge multiple record in a single record in SQL Server在 SQL Server 的单个记录中合并多个记录时出现错误消息 208
【发布时间】:2018-06-11 21:36:57
【问题描述】:

SQL Server 中的查询获取大约 30 条记录,包含 15 列。我想合并它并将其转换为一条记录,其中一条记录有 30*15 = 450 列。但是当我尝试在开始时声明 @SqlText 变量时。

这里是示例代码:

DECLARE @SqlText NVARCHAR(MAX) = ''
DECLARE @SqlText NVARCHAR(MAX) = 'select * from ((SELECT 'abc' AS ID,  
                            SUBSTRING(col1,0,10) ID_Mark,
                            CASE 
                              WHEN (UPPER(SUBSTRING(REPLACE(col2, '0123456789', NULL ), 0, 2 ))='E-')
                                   THEN SUBSTRING(REPLACE(col2, '0123456789', NULL ), 3, 4 ) .......
                                  group by ID, ID_Mark, col1, col2, .....)) PE'
SELECT @SqlText  = @SqlText  + ' INNER JOIN PE'+ CONVERT(VARCHAR, ID) +'.ID_Mark =  ' + CONVERT(VARCHAR, ID_Mark) 
FROM PE 
order by ID_Mark

SET @SqlText  = @SqlText  
EXEC (@SqlText)

当我执行这段代码时,我得到一个错误

消息 208 无效的对象名称“PE”。

其中 PE 是查询的表别名。如何解决此类问题?

【问题讨论】:

    标签: sql sql-server merge


    【解决方案1】:

    您收到错误消息,因为在查询字符串中,您给单引号错误。如果要在 Query 字符串中使用单引号,则应将其指定为 2 个单引号。

    所以如果你想在查询字符串中选择字符串'ABC',你应该这样给它

    EXEC('SELECT ''ABC'' AS MyStr')
    

    所以您的查询需要像这样更改

    DECLARE @SqlText NVARCHAR(MAX) = 'select * from ((SELECT ''abc'' AS ID,  
                                SUBSTRING(col1,0,10) ID_Mark,
                                CASE 
                                  WHEN (UPPER(SUBSTRING(REPLACE(col2, ''0123456789'', NULL ), 0, 2 ))=''E-'')
                                       THEN SUBSTRING(REPLACE(col2, ''0123456789'', NULL ), 3, 4 ) .......
                                      group by ID, ID_Mark, col1, col2, .....)) PE'
    SELECT @SqlText  = @SqlText  + ' INNER JOIN PE'+ CONVERT(VARCHAR, ID) +'.ID_Mark =  ' + CONVERT(VARCHAR, ID_Mark) 
    FROM PE 
    order by ID_Mark
    
    SET @SqlText  = @SqlText  
    EXEC (@SqlText)
    

    只需将每个单引号替换为 2 个单引号即可。

    【讨论】:

    • 当我用双引号替换单引号然后在收到错误消息 135 后,@SqlText 已经定义。查询批次中的变量名必须是唯一的。
    • 你已经声明了变量@SqlText 两次,删除第一个声明并尝试。请检查更新的答案
    • 是的,我再试一次,然后我得到“无效的对象名称 PE”
    • 那是因为您的数据库中没有名为 PE 的表或视图。
    • 如果您希望 PE 作为表的别名,请像 TableName as PE 一样使用它
    猜你喜欢
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    相关资源
    最近更新 更多