Sql server 那个密码是什么语言?嗨,托马斯,为我的回复太慢而道歉。我觉得你的解决方案很好。我假设这只是一个报表构造函数,所以性能构建查询实际上并不是一个优先事项。我不会喋喋不休地谈论游标等的使用。我唯一能发现的可能会给您带来问题的是您传递到字符串中的@Conditio
Sql server 那个密码是什么语言?嗨,托马斯,为我的回复太慢而道歉。我觉得你的解决方案很好。我假设这只是一个报表构造函数,所以性能构建查询实际上并不是一个优先事项。我不会喋喋不休地谈论游标等的使用。我唯一能发现的可能会给您带来问题的是您传递到字符串中的@Conditio,sql-server,xml,Sql Server,Xml,那个密码是什么语言?嗨,托马斯,为我的回复太慢而道歉。我觉得你的解决方案很好。我假设这只是一个报表构造函数,所以性能构建查询实际上并不是一个优先事项。我不会喋喋不休地谈论游标等的使用。我唯一能发现的可能会给您带来问题的是您传递到字符串中的@ConditionData变量,如果该变量包含一个包含单引号的字符串,您生成的查询将有语法错误-您可能希望对其进行转义。感谢您指出好的方面。因此,我将在@ConditionData中用双引号替换单引号,如replace(@ConditionData,“”,“”
那个密码是什么语言?嗨,托马斯,为我的回复太慢而道歉。我觉得你的解决方案很好。我假设这只是一个报表构造函数,所以性能构建查询实际上并不是一个优先事项。我不会喋喋不休地谈论游标等的使用。我唯一能发现的可能会给您带来问题的是您传递到字符串中的@ConditionData变量,如果该变量包含一个包含单引号的字符串,您生成的查询将有语法错误-您可能希望对其进行转义。感谢您指出好的方面。因此,我将在@ConditionData中用双引号替换单引号,如replace(@ConditionData,“”,“”,“”)。任何其他建议Ye,当您向where子句添加日期时,您正在将表date转换为varchar 112,这很好,但是您也将@ConditionData转换为VARCAR 112,这可能不正确,因为ConditionData不是日期,112样式将无效,您应该首先将ConditionData转换为具有验证等功能的日期(即捕捉胭脂日期),然后将结果转换为varchar–希望有意义。好主意,我将尝试生成where子句but'(搜索字段)[1]。为什么总是(SearchField)[1]和(FilterCondition)[1]我编辑了我的帖子,如果可能的话,请看一看并回答。非常感谢您的支持,这有助于最初的开始。新年快乐。这是我的最新脚本,您可以从中了解我如何在sql server中开发通用搜索SP。我在我的帖子底部加了一个。如果它能发展出更好的方式,请看一看并发表评论。thanks@Thomas作为对第一条注释的响应,[1]是一个排序的数组指示符,例如根节点中有多个同名节点,[1]只告诉SQL只读取第一个节点——如果xml以这种方式排列,这是避免运行时错误的常见做法——在您的示例中,根节点是“/NewDataSet/param”。
<NewDataSet>
<param>
<SearchField>EmployeeID</SearchField>
<FilterCondition> >= </FilterCondition>
<ConditionData>201</ConditionData>
<MatchCase>0</MatchCase>
</params>
<param>
<SearchField>DeptID</SearchField>
<FilterCondition> = </FilterCondition>
<ConditionData>AC01</ConditionData>
<MatchCase>0</MatchCase>
</params>
<param>
<SearchField>Dob</SearchField>
<FilterCondition> <= </FilterCondition>
<ConditionData>23-MAR-2010</ConditionData>
<MatchCase>0</MatchCase>
</params>
</NewDataSet>
INSERT INTO @tbl_WhereClause (SearchField, Operator, ConditionData, MatchCase,TableName)
SELECT A.B.value('(SearchField)[1]', 'VARCHAR(255)' ) SearchField,
A.B.value('(FilterCondition)[1]', 'VARCHAR(25)' ) Operator,
A.B.value('(ConditionData)[1]', 'VARCHAR(MAX)' ) ConditionData,
A.B.value('(MatchCase)[1]', 'BIT' ) MatchCase,
A.B.value('(Table)[1]', 'VARCHAR(MAX)' ) TableName
FROM @WhereClause_XML.nodes('/NewDataSet/param') A(B)
/*
XML DATA SAMPLE
<NewDataSet>
<param>
<SearchField>EmpID</SearchField>
<FilterCondition> >= </FilterCondition>
<ConditionData>201</ConditionData>
<MatchCase>0</MatchCase>
<Table>Employee</Table>
</param>
<param>
<SearchField>DeptName</SearchField>
<FilterCondition> = </FilterCondition>
<ConditionData>AC01</ConditionData>
<MatchCase>1</MatchCase>
<Table>Department</Table>
</param>
<param>
<SearchField>Dob</SearchField>
<FilterCondition> >= </FilterCondition>
<ConditionData>20120104</ConditionData>
<MatchCase>0</MatchCase>
<Table>Employee</Table>
</param>
</NewDataSet>'
*/
CREATE PROCEDURE GenericSearch
(
@WhereClause_XML XML,
@LogicalOperator VARCHAR(3)
)
AS
BEGIN
DECLARE @SearchField VARCHAR(255),
@Operator VARCHAR(25),
@ConditionData VARCHAR(MAX),
@MatchCase BIT,
@TableName VARCHAR(MAX),
@Validity VARCHAR(100),
@ColumnType VARCHAR(128),
@ColumnPrecision INT,
@ColumnScale INT,
@ColumnNullable bit,
@WhereClause VARCHAR(MAX)
DECLARE @tbl_WhereClause AS TABLE
(
SearchField VARCHAR(255),
Operator VARCHAR(25),
ConditionData VARCHAR(MAX),
MatchCase BIT,
TableName VARCHAR(MAX),
Validity VARCHAR(100),
ColumnType VARCHAR(128),
ColumnPrecision INT,
ColumnScale INT,
ColumnNullable bit
)
INSERT INTO @tbl_WhereClause (SearchField, Operator, ConditionData, MatchCase,TableName,
Validity, ColumnType, ColumnPrecision, ColumnScale, ColumnNullable)
SELECT A.B.value('(SearchField)[1]', 'VARCHAR(255)' ) SearchField,
A.B.value('(FilterCondition)[1]', 'VARCHAR(25)' ) Operator,
A.B.value('(ConditionData)[1]', 'VARCHAR(MAX)' ) ConditionData,
A.B.value('(MatchCase)[1]', 'BIT' ) MatchCase,
A.B.value('(Table)[1]', 'VARCHAR(MAX)' ) TableName,
CASE WHEN t.NAME+c.NAME IS NULL THEN 'invalid' ELSE 'valid' END ,
ty.NAME,
c.PRECISION,
c.Scale,
c.Is_Nullable
FROM @WhereClause_XML.nodes('/NewDataSet/param') A(B)
LEFT JOIN sys.tables t ON t.name = A.B.value('(Table)[1]', 'VARCHAR(MAX)' )
LEFT JOIN sys.COLUMNS c ON T.OBJECT_ID = c.OBJECT_ID AND c.name = A.B.value('(SearchField)[1]', 'VARCHAR(255)' )
LEFT JOIN sys.types ty ON c.system_type_id = ty.system_type_id
--SELECT * FROM @tbl_WhereClause
SET @WhereClause= 'WHERE 1=1'
DECLARE SearchCursor CURSOR FOR
SELECT * FROM @tbl_WhereClause
OPEN SearchCursor
FETCH NEXT FROM SearchCursor
INTO @SearchField, @Operator,@ConditionData,@MatchCase,@TableName,@Validity,@ColumnType,@ColumnPrecision,@Colu mnScale,@ColumnNullable
WHILE @@FETCH_STATUS = 0
BEGIN
IF CHARINDEX('INT', UPPER(@ColumnType)) > 0
BEGIN
SET @WhereClause = @WhereClause + space(1)+ @LogicalOperator + space(1) + @SearchField + space(1)+@Operator+space(1)+@ConditionData
END
ELSE IF CHARINDEX('NUMERIC', UPPER(@ColumnType)) > 0
BEGIN
SET @WhereClause = @WhereClause + space(1)+ @LogicalOperator + space(1) + @SearchField + space(1)+@Operator+space(1)+@ConditionData
END
ELSE IF CHARINDEX('BIT', UPPER(@ColumnType)) > 0
BEGIN
SET @WhereClause = @WhereClause + space(1)+ @LogicalOperator + space(1) + @SearchField + space(1)+@Operator+space(1)+@ConditionData
END
ELSE IF CHARINDEX('DECIMAL', UPPER(@ColumnType)) > 0
BEGIN
SET @WhereClause = @WhereClause + space(1)+ @LogicalOperator + space(1) + @SearchField + space(1)+@Operator+space(1)+@ConditionData
END
ELSE IF CHARINDEX('FLOAT', UPPER(@ColumnType)) > 0
BEGIN
SET @WhereClause = @WhereClause + space(1)+ @LogicalOperator + space(1) + @SearchField + space(1)+@Operator+space(1)+@ConditionData
END
ELSE IF CHARINDEX('REAL', UPPER(@ColumnType)) > 0
BEGIN
SET @WhereClause = @WhereClause + space(1)+ @LogicalOperator + space(1) + @SearchField + space(1)+@Operator+space(1)+@ConditionData
END
ELSE IF CHARINDEX('MONEY', UPPER(@ColumnType)) > 0
BEGIN
SET @WhereClause = @WhereClause + space(1)+ @LogicalOperator + space(1) + @SearchField + space(1)+@Operator+space(1)+@ConditionData
END
ELSE IF CHARINDEX('DATE', UPPER(@ColumnType)) > 0
BEGIN
SET @WhereClause = @WhereClause + space(1)+ @LogicalOperator + space(1) + 'CONVERT(varchar,'+@SearchField+',112)' + space(1)+@Operator+'CONVERT(varchar,'''+@ConditionData+''',112)'
END
ELSE IF CHARINDEX('CHAR', UPPER(@ColumnType)) > 0
BEGIN
SET @WhereClause = @WhereClause + space(1)+ @LogicalOperator + space(1) + @SearchField + space(1)+@Operator+''''+@ConditionData+''''
END
FETCH NEXT FROM SearchCursor
INTO @SearchField, @Operator,@ConditionData,@MatchCase,@TableName,@Validity,@ColumnType,@ColumnPrecision,@ColumnScale,@ColumnNullable
END
CLOSE SearchCursor
DEALLOCATE SearchCursor
SELECT @WhereClause
END
DECLARE @tbl_WhereClause AS TABLE (
SearchField VARCHAR(255),
Operator VARCHAR(25),
ConditionData VARCHAR(MAX),
MatchCase BIT
)
DECLARE @WhereClause_XML XML
SET @WhereClause_XML = '
<NewDataSet>
<param>
<SearchField>EmployeeID</SearchField>
<FilterCondition> >= </FilterCondition>
<ConditionData>201</ConditionData>
<MatchCase>0</MatchCase>
</param>
<param>
<SearchField>DeptID</SearchField>
<FilterCondition> = </FilterCondition>
<ConditionData>AC01</ConditionData>
<MatchCase>0</MatchCase>
</param>
<param>
<SearchField>Dob</SearchField>
<FilterCondition> <= </FilterCondition>
<ConditionData>23-MAR-2010</ConditionData>
<MatchCase>0</MatchCase>
</param>
</NewDataSet>'
INSERT INTO @tbl_WhereClause (SearchField, Operator, ConditionData, MatchCase)
SELECT A.B.value('(SearchField)[1]', 'VARCHAR(255)' ) SearchField,
A.B.value('(FilterCondition)[1]', 'VARCHAR(25)' ) Operator,
A.B.value('(ConditionData)[1]', 'VARCHAR(MAX)' ) ConditionData,
A.B.value('(MatchCase)[1]', 'BIT' ) ConditionData
FROM @WhereClause_XML.nodes('/NewDataSet/param') A(B)
SELECT * FROM @tbl_WhereClause