Insert 使用SAS将包含空值和空格的行插入数据库
我有一个db2表Insert 使用SAS将包含空值和空格的行插入数据库,insert,sas,db2,Insert,Sas,Db2,我有一个db2表DBTable,其中列a、B、C(所有类型都是varchar),它链接到SAS中的库lib。 我使用SAS生成一个数据集ValuesForA,其中有一列的内容我想写入DBTable的a,另外要求B的列填充”(空白)而C的列填充(空)。因此,DBTable应该如下所示: | A | B | C | ====================== | 'x' | ' ' | (null) | | 'y' | ' ' | (null) | | 'z' | ' ' | (
DBTable
,其中列a、B、C
(所有类型都是varchar),它链接到SAS中的库lib
。
我使用SAS生成一个数据集ValuesForA
,其中有一列的内容我想写入DBTable
的a
,另外要求B
的列填充”
(空白)而C
的列填充(空)
。因此,DBTable
应该如下所示:
| A | B | C |
======================
| 'x' | ' ' | (null) |
| 'y' | ' ' | (null) |
| 'z' | ' ' | (null) |
我找不到一种方法如何将其作为SAS,因为它将空格视为null
将
B
指定为“
的简单方法只是将(null)
填充到该列中。我还尝试使用nullchar=no
选项,但没有为C
指定值:
proc sql;
insert into lib.DBTable
(nullchar=no, A, B)
select
A, " " as B
from ValuesForA;
quit;
但是,C
列也会被空格填充
| A | B | C |
===================
| 'x' | ' ' | ' ' |
| 'y' | ' ' | ' ' |
| 'z' | ' ' | ' ' |
试试这个:
proc sql;
insert into lib.DBTable
select
A, " " as B, null as C
from ValuesForA;
quit;
这为我提供了使用包含三个VARCHAR列的DB2 temp表所需的结果。尝试以下方法:
proc sql;
insert into lib.DBTable
select
A, " " as B, null as C
from ValuesForA;
quit;
这给了我您使用一个包含三个VARCHAR列的DB2 temp表所要求的结果。我在上发布了相同的问题。 最后,我使用了s_lassen提出的解决方案(你可以查看他的另一个)。 我在这里对他的解决方案进行了自己的描述: 在相连的天秤座上插入空格和空位似乎是不可能的。但是,我们可以编写一个SAS程序来生成sql语句,我们可以使用直通sql在数据库服务器本身上执行该语句 这一切都是通过以下小脚本完成的:
/* *** Create a temporary document with the name "tempsas" *** */
Filename tempsas temp;
/* *** Loop throuhg ValuesForA and write into tempsas. *** */
/* (The resulting tempsas is basically an SQL insert statement. All observations are written in one big values statement) */
Data _null_;
file tempsas;
set ValuesForA end=done;
if _N_=1 then put
'rsubmit;' /
'proc sql;' /
' Connect to DB2(<connect options>);' /
' execute by DB2(' /
' insert into DBTable(A, B, C)' /
' values'
;
put
" ('" a +(-1) "', ' ', null)" @; /* "a" is an observation ValuesForA.a
"+(-1)" removes the trailing blank set by the put statement
"@" writes the next put statement in the same line */
if done then put
/
' );' /
'quit;' /
'endrsubmit;'
;
else put ',';
run;
/* *** Run the code in tempsas *** */
%include tempsas;
/****创建名为“tempsas”的临时文档****/
文件名tempsa temp;
/****通过值FORA循环并写入tempsas。****/
/*(生成的tempsa基本上是一个SQL insert语句。所有观察结果都写在一个大值语句中)*/
数据为空;
文件tempsa;
设置结束时的值=完成;
如果_N_=1,则将
“rsubmit;”/
'过程sql;'/
'连接到DB2();'/
'由DB2执行('/
'插入数据库表(A、B、C)'/
“价值观”
;
放
“(‘“a+(-1)”,‘,null)”@;/*“a”是a的观察值
“+(-1)”删除put语句后面的空白集
“@”在同一行中写入下一个put语句*/
如果这样做了,那么把
/
' );' /
“退出;”/
“endrsubmit;”
;
否则就放",",;
跑
/****在tempsas中运行代码****/
%包括临时助理;
它创建一个文件“tempsas”,在其中写入并执行以下代码:
rsubmit;
proc sql;
Connect to DB2(<connect options>);
execute by DB2(
insert into DBTable(A, B, C)
values
('x', ' ', null),
('y', ' ', null),
('z', ' ', null)
);
quit;
endrsubmit;
rsubmit;
proc-sql;
连接到DB2();
由DB2执行(
插入数据库表(A、B、C)
价值观
('x','',null),
('y','',null),
('z','',null)
);
退出
endrsubmit;
我想这个解决方案只有在没有太多的值插入到数据库时才可行。我在上发布了同样的问题。 最后,我使用了s_lassen提出的解决方案(你可以查看他的另一个)。 我在这里对他的解决方案进行了自己的描述: 在相连的天秤座上插入空格和空位似乎是不可能的。但是,我们可以编写一个SAS程序来生成sql语句,我们可以使用直通sql在数据库服务器本身上执行该语句 这一切都是通过以下小脚本完成的:
/* *** Create a temporary document with the name "tempsas" *** */
Filename tempsas temp;
/* *** Loop throuhg ValuesForA and write into tempsas. *** */
/* (The resulting tempsas is basically an SQL insert statement. All observations are written in one big values statement) */
Data _null_;
file tempsas;
set ValuesForA end=done;
if _N_=1 then put
'rsubmit;' /
'proc sql;' /
' Connect to DB2(<connect options>);' /
' execute by DB2(' /
' insert into DBTable(A, B, C)' /
' values'
;
put
" ('" a +(-1) "', ' ', null)" @; /* "a" is an observation ValuesForA.a
"+(-1)" removes the trailing blank set by the put statement
"@" writes the next put statement in the same line */
if done then put
/
' );' /
'quit;' /
'endrsubmit;'
;
else put ',';
run;
/* *** Run the code in tempsas *** */
%include tempsas;
/****创建名为“tempsas”的临时文档****/
文件名tempsa temp;
/****通过值FORA循环并写入tempsas。****/
/*(生成的tempsa基本上是一个SQL insert语句。所有观察结果都写在一个大值语句中)*/
数据为空;
文件tempsa;
设置结束时的值=完成;
如果_N_=1,则将
“rsubmit;”/
'过程sql;'/
'连接到DB2();'/
'由DB2执行('/
'插入数据库表(A、B、C)'/
“价值观”
;
放
“(‘“a+(-1)”,‘,null)”@;/*“a”是a的观察值
“+(-1)”删除put语句后面的空白集
“@”在同一行中写入下一个put语句*/
如果这样做了,那么把
/
' );' /
“退出;”/
“endrsubmit;”
;
否则就放",",;
跑
/****在tempsas中运行代码****/
%包括临时助理;
它创建一个文件“tempsas”,在其中写入并执行以下代码:
rsubmit;
proc sql;
Connect to DB2(<connect options>);
execute by DB2(
insert into DBTable(A, B, C)
values
('x', ' ', null),
('y', ' ', null),
('z', ' ', null)
);
quit;
endrsubmit;
rsubmit;
proc-sql;
连接到DB2();
由DB2执行(
插入数据库表(A、B、C)
价值观
('x','',null),
('y','',null),
('z','',null)
);
退出
endrsubmit;
我想这个解决方案只有在没有太多的值插入到数据库时才可行。您可以将DB2表更改为具有列
bchar(无论什么)默认值“”
不,我不能。我没有这个权利。它也是一个更大项目的一部分,所以改变总是要经过深思熟虑。我只需要这个特定的数据组合来测试一些工作流,然后将sql passthrough提交给insert into DBTable select*from tentable
,因为正是DB2 dba设计了一个表,希望将空白和空视为不同的值,所以应该让他们为您制定一个解决方案。也许他们可以创建一个不包含C列的可写视图。问题是,我无法创建临时表。区分空白和(空)也可能是不好的设计,但以不同的方式处理这些逻辑上非常不同的信息片段应该是完全可行的。因此,如果这不可能做到,我宁愿责怪SAS。您可以将DB2表更改为列bchar(无论什么)默认值“”
No,我可以