SQL-Server动态SQL失败



我有一个存储过程,该过程动态生成一个表以存放导入的分阶段数据。这个例程一直持续到星期三。我已经跟踪到一个特定区域。引起问题的代码是:

DECLARE @strSQL NVARCHAR(MAX) = N'';
SELECT  @strSQL = @strSQL + N',[' + CustomerField + N'] NVARCHAR(MAX)' + CHAR(10)
  FROM  dbo.WebServices
 WHERE  CallType = 'customer'
   AND  IsPrimaryTable = 1
   AND  Source = 'clientName'
 ORDER BY TagOrder;
SET @strSQL = STUFF(@strSQL, 1, 1, 'CREATE TABLE ' + 'TableName' + CHAR(10) + '(')+ N')';
PRINT @strSQL

nb。表格从保留列的列表中提取,数据也没有更改。大约有34行数据,没有特殊字符,并且不会暴露于客户端。

这给了我一个输出:

CREATE TABLE TableName
([CUSACNR2] NVARCHAR(MAX)
)

即使在SSMS上的同一窗口中,运行此操作,并带有附加的TOP过滤器为我提供了我期望的结果。

DECLARE @strSQL NVARCHAR(MAX) = N'';
SELECT  TOP (99999) @strSQL = @strSQL + N',[' + CustomerField + N'] NVARCHAR(MAX)' + CHAR(10)
  FROM  dbo.WebServices
 WHERE  CallType = 'customer'
   AND  IsPrimaryTable = 1
   AND  Source = 'clientName'
 ORDER BY TagOrder;
SET @strSQL = STUFF(@strSQL, 1, 1, 'CREATE TABLE ' + 'TableName' + CHAR(10) + '(')+ N')';
PRINT @strSQL

生成动态SQL:

CREATE TABLE TableName
([TAG] NVARCHAR(MAX)
,[CUSACNR] NVARCHAR(MAX)
.
.
.
,[SHIPPING_POSTAL_CODE] NVARCHAR(MAX)
,[CUSACNR2] NVARCHAR(MAX)
)
  • 删除了用于安全的特定列名

当我在一个特定的存储proc中跟踪它时,我们使用此技术来构建动态SQL很多,并且看到多个位置弹出的错误。我假设服务器上发生了一些变化,因为这已经开始在多个数据库中发生。

有人知道可能导致这个问题的任何东西吗?它的遗留系统已经运行了很长时间,并重新编码了此类活动的每一个实例。

我找到了答案。有点。我现在知道发生了什么变化,所以我已经能够纠正它,但是它应该没有任何区别。

桌子上有一个索引引起了问题。在您说这应该没有任何区别之前,您应该做对了,我设法通过删除和重新创建索引来可靠地解决和复制问题。

因此,这不是一个分裂问题,它不是集群索引,并且执行计划无论如何都不会搜索此索引。

CREATE NONCLUSTERED INDEX [idx_ntindex] ON [dbo].[WebServices] ([Source], [CallType], [SecurityKey])
GO
DECLARE @strSQL NVARCHAR(MAX) = N'';
SELECT  @strSQL = @strSQL + N',[' + ISNULL(CustomerField,'') + N'] NVARCHAR(MAX)' + CHAR(10)
  FROM  dbo.WebServices
 WHERE  CallType = 'customer'
   AND  IsPrimaryTable = 1
   AND  Source = 'clientName'
  ORDER BY TagOrder;
SET @strSQL = STUFF(@strSQL, 1, 1, 'CREATE TABLE ' + 'TableName' + CHAR(10) + '(') + N')';
PRINT @strSQL;
GO
DROP INDEX idx_ntindex ON dbo.WebServices
DECLARE @strSQL NVARCHAR(MAX) = N'';
SELECT  @strSQL = @strSQL + N',[' + ISNULL(CustomerField,'') + N'] NVARCHAR(MAX)' + CHAR(10)
  FROM  dbo.WebServices
 WHERE  CallType = 'customer'
   AND  IsPrimaryTable = 1
   AND  Source = 'clientName'
  ORDER BY TagOrder;
SET @strSQL = STUFF(@strSQL, 1, 1, 'CREATE TABLE ' + 'TableName' + CHAR(10) + '(') + N')';
PRINT @strSQL;

给我结果

CREATE TABLE TableName
([CUSACNR2] NVARCHAR(MAX)
)
CREATE TABLE TableName
([TAG] NVARCHAR(MAX)
,[CUSACNR] NVARCHAR(MAX)
,[DDAYS] NVARCHAR(MAX)
.
.
.
,[SHIPPING_POSTAL_CODE] NVARCHAR(MAX)
,[CUSACNR2] NVARCHAR(MAX)
)

如果有人知道为什么是这种情况,请告诉我。我找到了它,但对我来说没有任何意义。

感谢所有的帮助。 1用于所有支持,每个建议使我更加接近。

最新更新