2010-06-30 3 views
2

Я хочу использовать sp_msforeachtable для выполнения некоторых работ для некоторых таблиц в базе данных. Я использую оператор IF для фильтрации таблиц. Но это не дает мне правильного ответа. Как показывает следующий сценарий, я использую AdventureWorks для проведения тестирования. Я хочу сделать некоторые работы на каждом столе, кроме Person.Address, Person.Contact, Person.CountryRegion. Как вы можете видеть, эти таблицы все еще включены в результат. Зачем? Кто может помочь мне с моей проблемой? Большое спасибо.sp_msforeachtable не дает мне правильный результат

sp_msforeachtable ' 
IF ''?'' <> ''Person.Address'' AND ''?'' <> ''Person.Contact'' AND ''?'' <> ''Person.CountryRegion'' 
BEGIN 
    PRINT ''?'' 
END 
'; 

Результат:

[Sales].[Store] 
[Production].[ProductPhoto] 
[Production].[ProductProductPhoto] 
[Sales].[StoreContact] 
[Person].[Address] <------------------------------ 
[Production].[ProductReview] 
[Production].[TransactionHistory] 
[Person].[AddressType] 
[Production].[ProductSubcategory] 
[dbo].[AWBuildVersion] 
[Production].[TransactionHistoryArchive] 
[Purchasing].[ProductVendor] 
[Production].[BillOfMaterials] 
[Production].[UnitMeasure] 
[Purchasing].[Vendor] 
[Purchasing].[PurchaseOrderDetail] 
[Person].[Contact] <------------------------------ 
[Purchasing].[VendorAddress] 
[Purchasing].[VendorContact] 
[Purchasing].[PurchaseOrderHeader] 
[Sales].[ContactCreditCard] 
[Production].[WorkOrder] 
[Person].[ContactType] 
[Sales].[CountryRegionCurrency] 
[Production].[WorkOrderRouting] 
[Person].[CountryRegion] <------------------------------ 
[Sales].[CreditCard] 
[Production].[Culture] 
[Sales].[Currency] 
[Sales].[SalesOrderDetail] 
[Sales].[CurrencyRate] 
[Sales].[Customer] 
[Sales].[SalesOrderHeader] 
[Sales].[CustomerAddress] 
[HumanResources].[Department] 
[Production].[Document] 
[HumanResources].[Employee] 
[Sales].[SalesOrderHeaderSalesReason] 
[Sales].[SalesPerson] 
[HumanResources].[EmployeeAddress] 
[HumanResources].[EmployeeDepartmentHistory] 
[HumanResources].[EmployeePayHistory] 
[Sales].[SalesPersonQuotaHistory] 
[Production].[Illustration] 
[Sales].[SalesReason] 
[Sales].[Individual] 
[Sales].[SalesTaxRate] 
[HumanResources].[JobCandidate] 
[Production].[Location] 
[Sales].[SalesTerritory] 
[Production].[Product] 
[Sales].[SalesTerritoryHistory] 
[Production].[ScrapReason] 
[HumanResources].[Shift] 
[Production].[ProductCategory] 
[Purchasing].[ShipMethod] 
[Production].[ProductCostHistory] 
[Production].[ProductDescription] 
[Sales].[ShoppingCartItem] 
[Production].[ProductDocument] 
[Production].[ProductInventory] 
[Sales].[SpecialOffer] 
[Production].[ProductListPriceHistory] 
[Sales].[SpecialOfferProduct] 
[Production].[ProductModel] 
[Person].[StateProvince] 
[Production].[ProductModelIllustration] 
[dbo].[DatabaseLog] 
[Production].[ProductModelProductDescriptionCulture] 
[dbo].[ErrorLog] 

ответ

3

Вы пытались добавить скобки?

sp_msforeachtable ' 
IF ''?'' <> ''[Person].[Address]'' AND ''?'' <> ''[Person].[Contact]'' AND ''?'' <> ''[Person].[CountryRegion]'' 
BEGIN 
    PRINT ''?'' 
END 
'; 
+0

Боже, ваше решение работает. Но почему? Нельзя ли использовать имя схемы и имя объекта в одинарных кавычках? –

+2

@Yousui: посмотрите на выход - ms_foreachtable всегда использует скобки - поэтому вы не можете сравнивать с чем-то без скобок ... это просто вопрос форматирования строк ..... –

+0

appart из ничего, чтобы добавить к этому, я нечего добавить к этому :) –

3

Почему бы не просто использовать системные таблицы, поскольку кажется, что вы хотите, чтобы все таблицы не были в схеме Person?

select sys.schemas.name + '.' + sys.tables.name from sys.tables 
    inner join sys.schemas on sys.tables.schema_id = sys.schemas.schema_id 
    where sys.schemas.name <> 'Person' 
Смежные вопросы