【问题标题】:Excel How to import data from SQL Server using Transact SQLExcel 如何使用 Transact SQL 从 SQL Server 导入数据
【发布时间】:2015-03-12 10:37:49
【问题描述】:

我想使用 TSQL 将 SQL 服务器数据导入 Excel。在 Excel 中,我可以完美地检索带有 SQL 代码的表。但是当我编写 TSQL 代码而不是 SQL 时,它给了我“没有什么可检索的”。

Excel 是否支持 TSQL 代码?如果是这样,我如何将数据从 SQL Server 导入到 Excel?

顺便说一句,我有这个示例代码。

use GOPLUS;
DECLARE @kayitNo INT;
DECLARE @CardRefOfItem INT;
DECLARE @CardRefOfPrice INT;
DECLARE @urunKodu VARCHAR(100);
DECLARE @urunAdi VARCHAR(100);
DECLARE @fiyat1 INT;
DECLARE @fiyat2 INT;
DECLARE @fiyat3 INT;
DECLARE @numb INT;
DECLARE @kayitSayisi INT = (SELECT COUNT(*) FROM LG_001_ITEMS);
DECLARE @sayac INT = 0;

CREATE TABLE #UrunListesis( 
Sira INT NOT NULL PRIMARY KEY,
Ürün_Kodu VARCHAR(100),
Ürün_Adı VARCHAR(100),
Fiyat1 INT,
Fiyat2 INT,
Fiyat3 INT
)
set @kayitNo = (SELECT TOP 1 LOGICALREF FROM LG_001_ITEMS ORDER BY LOGICALREF ASC)

WHILE @sayac < @kayitSayisi
BEGIN

    set @urunKodu = (SELECT LG_001_ITEMS.CODE FROM LG_001_ITEMS WHERE LG_001_ITEMS.LOGICALREF = @kayitNo)
    set @urunAdi = (SELECT LG_001_ITEMS.NAME FROM LG_001_ITEMS WHERE LG_001_ITEMS.LOGICALREF = @kayitNo)

    set @CardRefOfPrice = (SELECT TOP 1 LOGICALREF FROM LG_001_PRCLIST WHERE CARDREF = @kayitNo)

    set @numb = (SELECT COUNT(*) FROM LG_001_PRCLIST WHERE LG_001_PRCLIST.CARDREF = @kayitNo)
    if (@numb >=1) 
    begin
        set @fiyat1 = (SELECT LG_001_PRCLIST.PRICE FROM LG_001_PRCLIST WHERE LG_001_PRCLIST.LOGICALREF = @CardRefOfPrice)
    end
    if (@numb >=2)
    begin
    set @fiyat2 = (SELECT LG_001_PRCLIST.PRICE FROM LG_001_PRCLIST WHERE LG_001_PRCLIST.LOGICALREF = @CardRefOfPrice+1)
    end
    if (@numb =3)
    begin
    set @fiyat3 = (SELECT LG_001_PRCLIST.PRICE FROM LG_001_PRCLIST WHERE LG_001_PRCLIST.LOGICALREF = @CardRefOfPrice+2)
    end

    INSERT INTO #UrunListesis VALUES(@kayitNo,@urunKodu,@urunAdi,ISNULL(@fiyat1,0),ISNULL(@fiyat2,0),ISNULL(@fiyat3,0));
    set @kayitNo = @kayitNo+1;
    set @sayac = @sayac + 1
    set @fiyat1 = 0
    set @fiyat2 = 0
    set @fiyat3 = 0
END

SELECT * FROM #UrunListesis

很可能我只想将临时表 UrunListesis 返回到 Excel 就是这样。

【问题讨论】:

    标签: sql-server excel tsql import


    【解决方案1】:

    如果您建立 SQL Server 连接而不是使用 Microsoft Query,则可以从 Excel 运行 T-SQL。选择数据 > 从其他来源 > 从 SQL Server

    输入您的服务器名称并选择您的数据库。 Excel 将为您提供表格列表。 这令人困惑,因为它看起来好像您不能使用 SQL 或 T-SQL,但您可以。来吧,选择一张桌子。在下一页设置您想要的任何设置,然后单击“完成”。

    出现导入数据对话框后,单击属性,然后选择定义选项卡。在 Command Type 下:将选择更改为 SQL。然后,您可以在 Command Text 框中输入您喜欢的任何 SQL 或 T-SQL。您现在可以使用 T-SQL,因为连接字符串是 SQL OLEDB,而不是更通用的东西。

    一旦您完成输入命令文本,Excel 将给您一个错误,告诉您连接将不再与您最初设置的连接相同。只需单击是,然后从那里继续。

    【讨论】:

      【解决方案2】:

      我解决了我的问题。如果你想在 Excel 中使用 TSQL。你应该声明一个存储过程。像这样;

      USE GOPLUS
      GO
      CREATE PROCEDURE deneme
      AS
      DECLARE @Urunlistesi TABLE( 
      Sira int,
      Ürün_Kodu VARCHAR(100),
      Ürün_Adı VARCHAR(100),
      Fiyat1 int,
      Fiyat2 int,
      Fiyat3 int
      )
      BEGIN
      SET NOCOUNT ON
      DECLARE @kayitNo INT;
      DECLARE @CardRefOfItem INT;
      DECLARE @CardRefOfPrice INT;
      DECLARE @urunKodu VARCHAR(100);
      DECLARE @urunAdi VARCHAR(100);
      DECLARE @fiyat1 INT;
      DECLARE @fiyat2 INT;
      DECLARE @fiyat3 INT;
      DECLARE @numb INT;
      DECLARE @kayitSayisi INT = (SELECT COUNT(*) FROM LG_001_ITEMS);
      DECLARE @sayac INT = 0;
      
      set @kayitNo = (SELECT TOP 1 LOGICALREF FROM LG_001_ITEMS ORDER BY LOGICALREF ASC)
      
      WHILE @sayac < @kayitSayisi
      BEGIN
      
          set @urunKodu = (SELECT LG_001_ITEMS.CODE FROM LG_001_ITEMS WHERE LG_001_ITEMS.LOGICALREF = @kayitNo)
          set @urunAdi = (SELECT LG_001_ITEMS.NAME FROM LG_001_ITEMS WHERE LG_001_ITEMS.LOGICALREF = @kayitNo)
      
          set @CardRefOfPrice = (SELECT TOP 1 LOGICALREF FROM LG_001_PRCLIST WHERE CARDREF = @kayitNo)
      
          set @numb = (SELECT COUNT(*) FROM LG_001_PRCLIST WHERE LG_001_PRCLIST.CARDREF = @kayitNo)
          if (@numb >=1) 
          begin
              set @fiyat1 = (SELECT LG_001_PRCLIST.PRICE FROM LG_001_PRCLIST WHERE LG_001_PRCLIST.LOGICALREF = @CardRefOfPrice)
          end
          if (@numb >=2)
          begin
          set @fiyat2 = (SELECT LG_001_PRCLIST.PRICE FROM LG_001_PRCLIST WHERE LG_001_PRCLIST.LOGICALREF = @CardRefOfPrice+1)
          end
          if (@numb =3)
          begin
          set @fiyat3 = (SELECT LG_001_PRCLIST.PRICE FROM LG_001_PRCLIST WHERE LG_001_PRCLIST.LOGICALREF = @CardRefOfPrice+2)
          end
      
          INSERT INTO @Urunlistesi VALUES(@kayitNo,@urunKodu,@urunAdi,ISNULL(@fiyat1,0),ISNULL(@fiyat2,0),ISNULL(@fiyat3,0));
          set @kayitNo = @kayitNo+1;
          set @sayac = @sayac + 1
          set @fiyat1 = 0
          set @fiyat2 = 0
          set @fiyat3 = 0
      END
      SELECT * FROM @Urunlistesi
      SET NOCOUNT OFF
      END
      GO
      

      然后将此代码用于excel;

      DECLARE @return_value int
      
      EXEC    @return_value = [dbo].[deneme]
      
      SELECT  'Return Value' = @return_value
      

      【讨论】:

        【解决方案3】:

        在 excel(2010) 中,我使用以下步骤以表格或数据透视格式返回数据:

        • 打开 Excel 点击数据选项卡选择“来自其他来源”选择 “来自 SQL Server”

        输入服务器信息

        在导入数据屏幕上

        • 选择属性转到定义选项卡将命令类型设置为 SQL 输入 SQL 查询到命令文本

        选择所需的数据输出并单击确定。

        【讨论】:

        • 是的,但是当您使用 SQL 临时表执行此操作时,您将收到“没有要检索的列”错误。无论如何谢谢回答:)
        【解决方案4】:

        另一种方法

        您可以使用 xp_cmdshell 将 sql 导入 xls 文件,从而以这种格式插入您的表结构和数据:

        <?xml version="1.0" standalone="yes"?>
        <Columns>
        <ColumnData Column1="asd" Column2="dsa" Column3="ads" />
        <ColumnData Column1="asd1" Column2="dsa2" Column3="ads3" />
        </Columns>
        

        使用类似的东西

        exec xp_cmdshell 'echo ^<?xml version="1.0" standalone="yes"?^> >>C:\file.xls'
        

        您可以创建一个带有 tableName 参数的过程,它将以最高格式格式化表格和数据并返回一个输出变量。

        【讨论】:

        • 感谢您的回答。但这太复杂了。我做不到。真的很感谢你的回答。
        猜你喜欢
        • 2015-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多