Recordset字段值从具有varchar(MAX)数据类型的SQL Server返回null

时间:2013-03-14 19:40:37

标签: sql-server-2008 excel-vba excel-2010 vba excel

我有一个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服务器的副本,并将列的数据类型更改为varchar(1024),并且它的工作方式应该如此。

我还尝试将记录集中的数据手动放入电子表格中,但没有运气。所以问题是我无法改变真正的SQL服务器。

是否有一个命令我可以添加到Select语句或我可以使用的转换器,它将varchar(MAX)转换为Excel可以使用的数据类型,或者是否还有其他我可以做的以便当我读到数据时,数据不为空?

我一直在研究这个问题,现在有一些线程关闭,但是他们正在谈论在SQL服务器上使用select,在这种情况下使用的模型不适用,或者在其他程序中使用没帮忙。

1 个答案:

答案 0 :(得分:0)

ADO显然无法正确处理VARCHAR(MAX)(或者您可能会如何预期),有关返回零列大小的内容,因为它未像VARCHAR(n)那样定义。

您回答了自己的问题,因为您只需要将列转换为具有已定义长度的列!

CAST(column AS type)

或在你的情况下

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