我有一个存储过程,该过程动态生成一个表以存放导入的分阶段数据。这个例程一直持续到星期三。我已经跟踪到一个特定区域。引起问题的代码是:
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用于所有支持,每个建议使我更加接近。