如何将SQL查询导出到SPSS?

时间:2014-03-12 17:15:48

标签: sql sql-server tsql spss

我有一个用T-SQL编写的怪物查询,它将多个表中的数据结合在一起并进行处理。我可以很容易地将结果导出到CSV或Excel,但是想将其直接发送到SPSS。 SPSS中的ODBC驱动程序仅识别SQL数据库中的表和视图。有任何想法如何将我的查询结果导入SPSS?

选项:

  • 导出到Excel然后导入到SPSS ...格式化日期之类的内容变得难以处理
  • 将查询保存为我的数据库中的表...但是每次运行查询时我都必须创建一个新表,是吗?
  • 如下所述,只需在我的SPSS语法的GET DATA语句中运行我的SQL语句,但我正在努力...

更新:为了尝试使用SPSS来运行我的SQL查询,我编辑了这段代码并得到此错误,表明SPSS不喜欢我的nvarchar声明(目前正在研究如何使用替代方法处理此问题)。我测试了SPSS和SQL之间的连接,连接很好:

SQLExecDirect failed :[Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near 'N'.

这是我的查询简化,只从一个表中提取一个字段:

GET DATA 
/TYPE=ODBC 
/CONNECT='DSN=temp_Hisp;Description=tempHisp;UID=;Trusted_Connection=Yes;APP=IBM SPSS '+ 
'Products: Statistics Common;WSID=ARCH5-50;DATABASE=temp_HispTreat' 
/SQL='With CTE_BASENG As (Select StudyID, Visit, Question, CAST(Response As Int) As RESPONSE from temp_HispTreat.dbo.BAS AS PVTable outer apply (values (N'BAS1',BAS1), +'
'(N'BAS24',BAS24)) P(Question, Response)) select SubVis.IRB#, SubVis.StudyID, SubVis.Clin_num, Subvis.Visit, BASENG.BAS_ENGTOT From (Select Distinct IRB#, StudyID, +'
'Clin_Num, Visit_ID As Visit from temp_HispTreat.dbo.Subjects, temp_HispTreat.dbo.StudyStructure where subjects.IRB# = 5516 and StudyStructure.IRB = 5516) As SubVis left join (Select StudyID, +'
'Visit, SUM (Scoring.dbo.GetValue9(response)) As BAS_ENGTOT from CTE_BASENG group by StudyID, Visit) AS BASENG On SubVis.Studyid = BASENG.StudyID And SubVis.Visit = BASENG.Visit'
/ASSUMEDSTRWIDTH=255. 
CACHE.
EXECUTE.

谢谢大家:解决了。让SPSS运行SQL查询需要进行相当多的调整,但这是将SQL数据导出到SPSS的最佳方法。在我的情况下,(values (N'BAS1',BAS1)必须更改为(values ("BAS1",BAS1)但我的所有命令,例如outer applyunion等,像冠军一样跑!感谢帮助。

2 个答案:

答案 0 :(得分:3)

您可以使用GET DATA过程直接在SPSS中导入SQL数据。请参阅SQL子命令。您可以在此处使用复杂的查询。例如:

GET DATA
 /TYPE = ODBC
 /CONNECT = "DSN = DSNname"
 /SQL = "SELECT * FROM empl_data "
        "WHERE ((bdate>=#1/1/1960# and edate<=#12/31/1960#) or bdate is null)".

很明显为什么(values (N'BAS1',BAS1)导致错误。因为您使用单引号作为SQL子命令\SQL = ' '的参数。 (values (N'BAS1',BAS1)中的第一个单引号定义了参数的结束。切换到双引号可以解决它。

我试图重新安排您的代码。我无法测试它,但我相信它应该可行:

GET DATA
  /TYPE = ODBC 
  /CONNECT = "DSN=temp_Hisp;DATABASE=temp_HispTreat"
  /SQL = "With CTE_BASENG As (Select StudyID, Visit, Question, "
           "CAST(Response As Int) As RESPONSE "
         "from temp_HispTreat.dbo.BAS AS PVTable "
         "outer apply (values (N'BAS1',BAS1), (N'BAS24',BAS24)) "
           "P(Question, Response)) "
         "select SubVis.IRB#, SubVis.StudyID, SubVis.Clin_num, Subvis.Visit, "
           "BASENG.BAS_ENGTOT "
         "From (Select Distinct IRB#, StudyID, Clin_Num, Visit_ID As Visit "
         "from temp_HispTreat.dbo.Subjects, temp_HispTreat.dbo.StudyStructure "
         "where subjects.IRB# = 5516 and StudyStructure.IRB = 5516) As SubVis "
         "left join (Select StudyID, Visit, "
           "SUM(Scoring.dbo.GetValue9(response)) As BAS_ENGTOT "
         "from CTE_BASENG group by StudyID, Visit) AS BASENG On "
           "SubVis.Studyid = BASENG.StudyID And SubVis.Visit = BASENG.Visit".

答案 1 :(得分:1)

SQL由ODBC驱动程序处理,因此该驱动程序的功能将决定可以发出什么类型的SQL。功能可能是特定于数据库的。有时,特定数据库可以使用多个驱动程序,其中一些来自IBM SPSS Data Access Pack,另一些来自数据库供应商,因此您可能需要调查可用于特定数据库的数据库。