最近遇到一个需求,就是在C#代码中构造字符串然后传入SQL代码中,在SQL中分离此字符串,将结果构造成临时表,作为另一个SQL语句的 in 子句。
解决方案:创建一个函数用于分离字符串;定义一个表变量,用于构造临时表。注意:不能使用declare #tableName 创建临时表,因为这样创建的表会
存在tmpdb系统数据库里面,访问量大的情况下就会造成数据库服务器变大。
C#代码中构造字符串,如:
string yo = "IT,ITMIS";
创建字符串分离函数
CREATE Function [dbo].[Split](@Sql varchar(8000))
returns @temp TABLE (code varchar(100))
As
Begin
DECLARE @Splits varchar(10)
SET @Splits=','
DECLARE @i Int
Set @Sql=RTrim(LTrim(@Sql))
Set @i=CharIndex(@Splits,@Sql)
While @i >= 1
Begin
Insert @temp Values(Left(@Sql,@i-1))
Set @Sql=SubString(@Sql,@i+1,Len(@Sql)-@i)
Set @i=CharIndex(@Splits,@Sql)
End
If @Sql <> ' '
Insert @temp VALUES (@Sql)
Return
End
创建临时表变量
DECLARE @Sql VARCHAR(100)
SET @Sql=@yo
嵌入主查询语句
DECLARE @Sel INT
DECLARE @codeTable TABLE(tmpCode NVARCHAR(100))
INSERT INTO @codeTable(tmpCode) SELECT * FROM SPLIT(@Sql)
SELECT * FROM dbo.ExpensesReimbursementVoucher WHERE DepartmentCode
IN (SELECT * FROM @codeTable)