Sql server 2008 记录集字段值从数据类型为varchar(MAX)的SQL server返回null

Sql server 2008 记录集字段值从数据类型为varchar(MAX)的SQL server返回null,sql-server-2008,excel,excel-2010,vba,Sql Server 2008,Excel,Excel 2010,Vba,我有一个SQL 2008服务器,服务器中有一个表,其中有一个数据类型为varchar(MAX)的列。我正在尝试使用ADO将此表中的某些列导入Excel 2010。下面是我正在使用的代码示例: Dim con As Object Set con = CreateObject("ADODB.Connection") cmd.CommandText = "SELECT dbo.(Table Name).Name From dbo.(Table)" cmd.CommandType = 1 con.op

我有一个SQL 2008服务器,服务器中有一个表,其中有一个数据类型为varchar(MAX)的列。我正在尝试使用ADO将此表中的某些列导入Excel 2010。下面是我正在使用的代码示例:

Dim con As Object
Set con = CreateObject("ADODB.Connection")

cmd.CommandText = "SELECT dbo.(Table Name).Name From dbo.(Table)"
cmd.CommandType = 1
con.open
cmd.ActiveConnection = con
Dim rst as Object
set rst = cmd.Execute

ActiveSheet.cells(targetRange.Row, targetRange.Column).CopyFromRecordset rst
但是,代码执行得很好,因为列名被设置为varchar(MAX),工作表中没有显示任何名称。我之所以知道这一点,是因为我制作了SQL server的副本,并将列的数据类型更改为varchar(1024),并且它的工作方式应该是这样的

我还尝试手动将记录集中的数据放入电子表格,但没有成功。所以问题是我不能改变真正的SQL server

是否有可以添加到Select语句的命令或可以使用的转换将varchar(MAX)转换为Excel可以使用的数据类型,或者是否有其他方法可以使数据在读入时不为空


我已经研究了一天这个问题,一些线程即将接近,但他们正在讨论在SQL server上使用select进行强制转换,在这种情况下不起作用,或者在其他一些程序中也不起作用。

ADO显然无法正确处理
VARCHAR(MAX)
(或者您可能期望的方式),关于返回零列大小的内容,因为它的定义与
VARCHAR(n)
的定义不同

您回答了自己的问题,因为您只需要将您的专栏转换为具有定义长度的内容

CAST(column AS type)
还是你的情况

SELECT CAST(dbo.(Table Name).Name AS VARCHAR(1024)) FROM dbo.(Table)

你试过投这种类型吗<代码>从dbo.(表)中选择CAST(dbo.(表名)。名称为VARCHAR(1024))我确实尝试过,但我用错了,谢谢你,一切都正常。这是一个糟糕的建议,使用的提供者就是问题所在。更新连接字符串以使用正确的提供程序,
VARCHAR(MAX)
将正常工作。这似乎起作用的原因是SQL Server将其强制转换为较旧的提供程序知道如何处理的数据类型。这与ADODB正确处理数据类型无关,只是所使用的提供程序不知道如何处理
VARCHAR(MAX)
,因为提供程序提前了数据类型的日期,更新连接字符串以使用正确的提供程序。虽然这可能不是完美的解决方案,但它确实解决了问题@Lankymart为什么不添加一个答案,详细说明更好的解决方案?