Office中国论坛/Access中国论坛

标题: 用變量構造出來的SQL語句在TSQL中怎樣作才能執行哪? [打印本页]

作者: HG    时间: 2002-10-27 00:52
标题: 用變量構造出來的SQL語句在TSQL中怎樣作才能執行哪?
declare result as varchar(600)
result = "select * from uv_wage_month_total_union_history where wage_date_year="+str(@my_year)+" and wage_date_month="+ str(@my_date_month)
----------------------------------------
請問現在構造完了,但怎樣作此語句才可以執行哪?有點迷啦。請各位指教,多謝![em15]
作者: HG    时间: 2002-10-28 17:42
create procedure usp_qry_xwage_xmonth_en @my_year smallint,@my_month tinyint,@my_dept_str  varchar(200) = null,@my_title_str varchar(200) = null,@my_emp_sn_str varchar(200)=null
as
begin
declare @result  varchar(600)
  set @result = "select * from uv_wage_month_total_union_history where wage_date_year="+str(@my_year)+" and wage_date_month="+ str(@my_month)
if @my_dept_str is not  null
          @result = @result +  "and dept_no in ("+@my_dept_str +")" /*出錯
if @my_title_str is not null
          @result = @result + " and emp_title in ("+@my_title_str+")" /*出錯
if @my_emp_sn_str is not null
        @result = @result + " and emp_sn in ("+@my_emp_sn_str+")" /*出錯
execute @result
end
請問各位,為什麼會出錯。錯誤提示如下:Incorrect syntax near '@result'.
為什麼,請各位指點。多謝!

作者: freemanager    时间: 2002-10-28 18:36
瞧着就眼晕。
假如你的三个if其中有一个条件成立,那么构造出来的东东应该是这样的:

select * from uv_wage_month_total_union_history where wage_date_year="+str(@my_year)+" and wage_date_month="+ str(@my_month) ?and ...

注意那个大问号,那是俺为了说明问题加进去的,问号前是变量,那么问号处是不是缺点什么?
    这只是就事论事了,可以把你构造的过程在VBA中进行测试,看看结果字符串是不是你想要的。或者存储过程什么也不干只返回一个字符串看看是个什么东东。

作者: HG    时间: 2002-10-28 18:42
多些我師,我現在已找到原因了。在構造的過程中,變量和字構串之間的問題。
現更正如下:
create procedure usp_qry_xwage_xmonth_en @my_year smallint,@my_month tinyint,@my_dept_str  varchar(200),@my_title_str varchar(200),@my_emp_sn_str varchar(200)
as
begin
-- 多條件模糊查詢作者黃冠 email:hghuanguan@cmmail.com mobile:13005868658
declare @query as varchar(600)
set @query = 'select * from uv_wage_month_total_union_history where wage_date_year="'+str(@my_year)+'" and wage_date_month="'+ str(@my_month)
if @my_dept_str is not  null
         set @query = @query + '"  and dept_no in ("'+@my_dept_str +'")"'
if @my_title_str is not null
          set @query = @query + '" and emp_title in ("'+@my_title_str+'")"'
if @my_emp_sn_str is not null
           set @query = @query + '" and emp_sn in ("'+@my_emp_sn_str+'")"'
execute @query
end
----------------------------------
原因就在於:'"之間的區別,請老師講一下,多謝!
作者: HG    时间: 2002-10-28 21:00
set @query = 'select * from uv_wage_month_total_union_history where wage_date_year="'+ str(@my_year)+'" and wage_date_month="'+ str(@my_month)
請問在這句中,因字段wage_date_year和wage_date_month是數字,但怎麼才可以再把上述字符串中的str(@my_year)和str(@my_month)轉換為數字哪?
多謝!
作者: access2sql    时间: 2002-10-29 02:06
set @query = 'select * from uv_wage_month_total_union_history where wage_date_year= '+ str(@my_year)+' and wage_date_month='+ str(@my_month)
-- ??去掉引号是数字


[此贴子已经被作者于2002-10-28 18:06:11编辑过]


作者: HG    时间: 2002-10-29 02:23
在這條語句中,如果有字符和數字是不可以用“+”號來連接的,我只有先轉為字符才可構造句,但在語句構造完成後又怎樣還原數字類型哪?有想過嗎?
作者: access2sql    时间: 2002-10-29 02:49
我想@query 参数是文本,
set @query = 'select * from uv_wage_month_total_union_history where wage_date_year="'+ str(@my_year)+'" and wage_date_month="'+ str(@my_month)
假设 @QUERY 在完成后应该是
set @query = 'select * from uv_wage_month_total_union_history where wage_date_year= 2001 and wage_date_month= 2'
这样的形式,那么是否只要去除双引号 " 即可?

另外我想问一下, STR 为转换函数,那么 CAST 逆转换哪?
[此贴子已经被作者于2002-10-28 18:49:04编辑过]


作者: HG    时间: 2002-10-29 02:58
但是現在的問題是您在轉換為數字時,且在構造時引入此函數,便無法構造,放下先不談,先看這個
set @query = 'select * from ufn_qry_xwage_xmonth_en('@my_year','@my_month')'
在這個中,怎樣把@my_year和@my_month變量,引入到函數中去哪?
且在函數中,多個參數間的逗句,譔怎麼處理哪?
作者: cg1    时间: 2002-10-29 03:42
set @query = 'select * from uv_wage_month_total_union_history where wage_date_year= ' + str(@my_year) + ' and wage_date_month = ' + str(@my_month)

我想问一下,这样可否运行?

作者: HG    时间: 2002-10-29 22:41
cgl您說的哪句可以運行,但我的年月是數字的,問題是當構造完的SQL語句是字符串,所以無法執行。可有辦法,又怎樣把數字值引入到上例中的函數中去哪?多謝!
作者: HG    时间: 2002-10-30 00:15
終於作出來啦。原因嘛,很簡單,對比一下上面的即可見分曉。
--use acc
/*
alter procedure usp_qry_xwage_xmonth_en @my_year smallint,@my_month tinyint,@my_dept_str  varchar(200) = null,@my_title_str varchar(200) = null,@my_emp_sn_str varchar(200) =null   
as     
begin   
declare @query as varchar(200)
set @query ='select * from uv_wage_month_total where wage_date_year='+str(@my_year)+' and wage_date_month='+str(@my_month)
if @my_dept_str is not  null     
         set @query = @query + '  and dept_no in ('+@my_dept_str +')'   
if @my_title_str is not null   
          set @query = @query + ' and emp_title in ('+@my_title_str+')'   
if @my_emp_sn_str is not null   
           set @query = @query + ' and emp_sn in ('+@my_emp_sn_str+')'   
execute(@query)
end     
*/
--exec usp_qry_xwage_xmonth_en @my_year=2002,@my_month=9,@my_dept_str="'HHoffice','HHQA'"
作者: access2sql    时间: 2002-10-30 00:44
不是和 CG1 说的一样吗?
作者: HG    时间: 2002-10-30 01:54
看來您還沒看出問題所在,我提示在TSQL中有這樣一條語句才是解決問題所在
exec(@query) 為什麼不是execute @query哪?
如果@query所用字段全部是字符品,則execute @query是可以通過的。我憶測試過。
sql2k企業版SQLp2,win2000和sp2都是英文版.
作者: access2sql    时间: 2002-10-30 18:40
能否再问一下
--use acc
/*
alter procedure usp_qry_xwage_xmonth_en @my_year smallint,@my_month tinyint,@my_dept_str varchar(200) = null,@my_title_str varchar(200) = null,@my_emp_sn_str varchar(200) =null
as
begin
declare @query as varchar(200)
set @query ='select * from uv_wage_month_total where wage_date_year='+str(@my_year)+' and wage_date_month='+str(@my_month)
if @my_dept_str is not null
set @query = @query + ' and dept_no in ('+@my_dept_str +')'
if @my_title_str is not null
set @query = @query + ' and emp_title in ('+@my_title_str+')'
if @my_emp_sn_str is not null
set @query = @query + ' and emp_sn in ('+@my_emp_sn_str+')'
-- 注意:
exec @query
-- 这样能否执行?因为前面的 @query的赋值过程已经和你第一个帖子的赋值过程
-- 完全不同了, 而且现在 @query 赋值的最后结果也全部是字符,我想里面已经不
-- 涉及到数字了,因为里面所有的数字已经全部用  str() 函数转换为字符了
-- 不好意思,我问得比较繁琐一点,主要是我刚学 sql ,问仔细点以后就不用自己再
-- 慢慢捉摸了
end
*/
--exec usp_qry_xwage_xmonth_en @my_year=2002,@my_month=9,@my_dept_str="'HHoffice','HHQA'"
作者: HG    时间: 2002-10-30 19:55
這樣是不可以執行的,只因為構造的代碼中有數字出現。
但現在我又有問題出現啦,用上述構造的代碼,已成功執行(在SQL環境中)但在ADP前端ACCESS中卻無記錄集返回。提示如下:the stored procedure executed successfully but did not return records.為什麼成功執行卻無記錄集返回。
我現在想上述構的存儲過程作為報表的數據源,但現在成功的無記錄集返回,怎麼回事,請各位指點。多謝!
作者: access2sql    时间: 2002-10-30 23:56
是否要设定 output关键字?
作者: HG    时间: 2002-10-31 00:19
與這個無關,現在的問題是在SQL分析器中是沒有絲毫問題的,但是在ADP客戶端卻無法返回記錄集。




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3