现在的位置: 首页 > 综合 > 正文

SQL 学习使用exec sp_executesql来执行字符串

2013年07月25日 ⁄ 综合 ⁄ 共 2438字 ⁄ 字号 评论关闭

       在物料管理过程中,往往不同的物料库的盘库功能实现的数据库表基本上是一样的。只不过是各自有各自的物料盘库表。如果细分析一下SQL,发现除了表名称以外,其他字段均相同,这时就可以通过使用exec sp_executesql来高度封装SQL语句,减少SQL语句的错误。提高开发速度。

         做为单品管理,数量很大,通常一两天内不可能盘完,所以需要系统能够在不影响正常出入库的前提下,支持动态盘库,以下是实现盘库出库标记的一段代码:该功能主要用的exec sp_executesql

       代码实现功能:

       首先判断是否在盘库状态,如果不是,则直接返回,不再执行后续动作。

       在盘库状态,如果物料是本期盘库之前的入库的,则需要将其标为出库盘库,以便复原本期盘库时的真实库存。其中还涉及到平库(数据库与实物核对不上时,需要做平库处理,实现数据库与实物保持一致)处理动作。

      

	DECLARE @strPro		char(30)
	DECLARE @ID_Pro		bigint
	DECLARE @BillType	bigint

	SET @strPro = 'AADA01A02NJP'
	SET @ID_Pro = 12100101010100200

	DECLARE @Tab_Inventory		char(100)
	DECLARE @Tab_Inventory_ST	char(100)
	DECLARE @Tab_IBG	char(100)
	DECLARE @Tab_IBL	char(100)
	DECLARE @Tab_IBH	char(100)
	
	SET @Tab_Inventory_ST = 'WH_WP_Inventory_ST'
	SET @Tab_IBG = 'WH_WP_IBG'
	SET @Tab_IBL = 'WH_WP_IBL'
	SET @Tab_IBH = 'WH_WP_IBH'


	DECLARE @strSQL		nchar(1000)
	DECLARE @strValue	nchar(50)

	-- 1. 判断是否在盘库状态
	SET @strSQL = 'SELECT TOP 1 @strValue = EndTime FROM ' + RTRIM(@Tab_Inventory_ST) + ' ORDER BY StartTime DESC'
	EXEC SP_EXECUTESQL @strSQL , N'@strValue nchar(50) output',@strValue output

	IF @strValue IS NOT NULL
		RETURN;

--	PRINT '正在盘库...'

	-- 2. 判断该片是否为盘库单据
	IF @BillType = 0 
	BEGIN	-- 盘库单
		SET @strSQL = 	
			  'UPDATE ' + RTRIM(@Tab_Inventory) + char(10)
			+ 'SET Flag2 = 2500' + char(10)
			+ 'WHERE Name =' + @strPro

		EXEC (@strSQL);

		RETURN;
	END

	-- 3. 判断该片是否为盘库之前的入库片
	SET @strSQL = 	
		  'SELECT   @strValue = T101.ID_Wafer ' + char(10)
		+ 'FROM	'		+ RTRIM(@Tab_IBG)	+ ' AS T101' + char(10)
		+ 'INNER JOIN ' + RTRIM(@Tab_IBL)	+ ' AS T102 ON T102.ID_BList = T101.ID_BList' + char(10)
		+ 'INNER JOIN ' + RTRIM(@Tab_IBH)	+ ' AS T103 ON T103.BillNo	= T102.BillNo' + char(10)
		+ 'WHERE'+ char(10)
		+ '		T101.ID_Wafer = ' + RTRIM (CONVERT(CHAR(30),@ID_Pro))+ char(10)
		+ '	AND	'  + char(10)
		+ '	(	' + char(10)
		+ '	-- 00.1 在盘库开始后入库,不算本期盘库' + char(10)
		+ '		T103.DT_MoveOut <= (SELECT MAX(StartTime) FROM ' + RTRIM(@Tab_Inventory_ST) + ' )' + char(10)
		+ '	)'
	
	EXEC SP_EXECUTESQL @strSQL , N'@strValue nchar(50) output',@strValue output

	IF @strValue IS NOT NULL
		RETURN;	-- 物料为盘库之后入库片

	-- 3.1 判断该片是否为未盘库或为已经盘库,修改为出库标记
	SET @strSQL = 
		  'SELECT @strValue = Name ' + char(10) 
		+ 'FROM ' + RTRIM(@Tab_Inventory) + char(10)
		+ ' WHERE Name = ' + @strPro + char(10)

	EXEC SP_EXECUTESQL @strSQL , N'@strValue nchar(50) output',@strValue output

	IF @strValue IS NULL
		BEGIN
		-- 未盘库
			SET @strSQL = 
				  'INSERT INTO ' + RTRIM(@Tab_Inventory) + char(10)
				+ '(Name,Flag1)'+ char(10)
				+ 'VALUES(' + @strPro + ',11)'+ char(10)

			EXEC (@strSQL)
			RETURN
		END
	ELSE
		BEGIN
		-- 已经盘库,修改为出库标记
			SET @strSQL = 
				  'UPDATE ' + RTRIM(@Tab_Inventory) + char(10)
				+ 'SET Flag1 = 11 WHERE Name = ' + @strPro+ char(10)

			EXEC (@strSQL)
			RETURN
		END

	RETURN

 

     把以上SQL做成一个SP,嵌入在出库环节,就可以实现动态盘库了。不同的物料库对于盘库动作也是一样的,仅修改相关对应的表就是了。

      SP_EXECUTESQL 相关用法参见http://technet.microsoft.com/zh-cn/library/ms188001.aspx

抱歉!评论已关闭.