SQL-Server动态SQL失败

问题描述 投票:2回答:1

我有一个存储过程,动态生成一个表来保存导入的登台数据。这个程序运行正常,直到星期三。我已将此跟踪到一个特定区域。导致问题的代码是:

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)
)
  • 为安全性删除了特定列名称

虽然我在一个特定的存储过程中跟踪了这个,但我们使用这种技术来构建动态SQL很多,我看到错误在多个地方突然出现。我假设服务器上的某些内容已经发生了变化,因为这已经开始在多个数据库中同时发生。

有谁知道可能导致这个问题的任何事情?它是一个长期运行良好并且重新编码此类活动的每个实例的遗留系统不是一种选择。

sql-server sql-server-2016 dynamic-sql
1个回答
1
投票

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

桌子上有一个引起问题的索引。在你说不应该有任何区别之前,你是对的不应该,我已经设法通过删除和重新创建索引来可靠地解决和重现问题。

所以这不是碎片问题,它不是聚集索引,并且执行计划无论如何都不会通过此索引进行搜索。

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,每个建议让我更接近。

© www.soinside.com 2019 - 2024. All rights reserved.